菜鸟学习历程【10】机器字节序、大小端的判断与修改
来源:互联网 发布:培训交互设计师知乎 编辑:程序博客网 时间:2024/04/18 16:56
机器字节序、大小端的判断与修改
首先,看一下下面这张图我们定义一个整型变量a,假设其起始地址为0x100,结束地址为0x103,那么0x100对应低地址,0x103对应高地址,对于存放的二进制数据,最前面“0000 0000”为高字节,最后的“0000 0001”对应低字节,但究竟是高字节存放在低地址还是高地址,各个机器不同,因此会有不同的情况。当高字节存放在低地址时,为大端,高字节存放在高地址为小端。那么我们如何判断机器的字节序呢?我们可以使用联合体,来解决这个问题,因为联合体中的成员共用一段内存。代码如下:#include <stdio.h>union test{ short val; char array[sizeof(short)];};int main(){ union test t; t.val = 0x0102; if(t.array[0] == 2 && t.array[1] == 1) { printf("Little Endian\n"); } else if(t.array[0] == 1 && t.array[1] == 2) { printf("Big Endian\n"); } else { printf("Unkown\n"); } return 0;}
那么我们如何实现大小端的转换呢?我们使用位运算和移位实现这个问题。首先,我们需要知道,是如何移位的,例如,unsigned int a;假设a 的二进制为:1011 1000 0001 1100 1110 0011 1011 0011a & 0x0000 00ff << 24 1011 0011 0000 00000000 00000000 0000a & 0x0000 ff00 << 8 0000 0000 1110 0011 0000 0000 0000 0000a & 0x00ff 0000 >> 8 0000 0000 0000 0000 0001 11000000 0000a & 0xff00 0000 >> 24 0000 0000 0000 0000 0000 0000 1011 1000#include <stdio.h>int main(){ unsigned int a = 1; unsigned int b; b = (((a & 0x000000ff) << 24) | ((a & 0x0000ff00) << 8 ) | ((a & 0x00ff0000) >> 8) | ((a & 0xff00000) >> 24)); printf("%d\n", b); return 0;}
阅读全文
0 0
- 菜鸟学习历程【10】机器字节序、大小端的判断与修改
- C语言 机器字节序、大小端的判断与修改
- 如何简单的判断机器的大小端字节序
- 判断机器大小字节序
- 杂项-机器字节顺序大小端判断
- 大小端字节序的判断
- 大小端字节序的判断
- 大小端字节序的判断
- 什么是大端字节序?什么是小端字节序?如何用共用体判断机器的大小端?
- 判断机器的字节序
- 大小端字节序判断
- 判断机器的大小端
- 判断机器的大小端
- 测试机器大小端字节序的小程序
- 大小字节端判断
- 字节大小端判断
- 主机字节序大小端判断
- 用函数判断大小端字节序
- 教大家微信里投票的怎么刷票及微信投票怎么免费刷票攻略
- Mac客户端下使用多个git账号
- Merge Two Binary Trees
- C++多态总结(一)
- 常用正则表达式汇总
- 菜鸟学习历程【10】机器字节序、大小端的判断与修改
- JAVA | 10
- 图的广度搜索(C语言版)
- Tensorflow学习(3)参数初始化
- 十三:表达式if ... else
- 算法练习(24):Counting Bits
- java 金额计算不能用float、doube!!!!必须用BigDecimal
- 第一道BFS
- SDUT-oj 时间日期格式转换(详解)