一、机器字节序
1、int a = 1;
低地址 高地址
0x100 0x101 0x102 0x103
对于 int 型的整数1,对应的二进制数为:
0000 0000 0000 0000 0000 0000 0000 0001
高字节 低字节
2、我们定义一个整形变量a,假设其初始地址为0x100,结束地址为0x103,那么0x100对应
低地址,0x103对应高地址。而对于二进制数据,最前面为高字节,最后面为低字节,但
低地址存放高字节还是低字节呢?各个机器可能不同。
3、低地址存放高字节为大端;低地址存放地字节为小端;
二、那么该如何判断机器的字节序呢?
我们可以使用联合体,因为联合体的成员共用一段内存。
代码如下:
#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; }
三、那么如何实现大小端的转换呢?1、使用位运算 2、移位
那么该如何移位呢?
定义一个unsigned int a;
假设a的二进制位:1011 1100 0001 1100 1110 0011 0011 0001
a & 0x0000 00ff << 24 0011 0001 0000 0000 0000 0000 0000 0000
a & 0x0000 ff00 << 8 0000 0000 1110 0011 0000 0000 0000 0000
a & 0x00ff 0000 >>8 0000 0000 0000 0000 0001 1100 0000 0000
a & 0xff00 0000 >>24 0000 0000 0000 0000 0000 0000 1011 1100
代码实例:
#include <stdio.h> int mian() { unsigned int a = 1; unsigned int b; b = (((a & 0x000000ff) << 24) | ((a & 0x0000ff00) << 8) | ((a & 0x00ff0000) >> 8) | ((a & 0xff000000) >>24)); printf("%d\n",b); return 0; }