C/C++ 大端存储 & 小端存储
内存中存放数据的两种模式:大端存储(或大端模式,Big-Endian) & 小端存储(或小段模式,Little-Endian)
大端存储(Big-Endian)
数据的高字节存储在低地址中,数据的低字节存储在高地址中。如:
int a = 1;
// int 在内存中占 4Byte;
// a 在内存中的分布为 0x1 0x0 0x0 0x0;
// 从左到右内存地址降低,也就是高字节地址存放的是 a 的低字节数据
应用:C51 是大端存储;socket 编程中网络字节序一般是大端存储
小端存储(Little-Endian)
数据的高字节存储在高地址中,数据的低字节存储在低地址中。如:
int a = 1;
// int 在内存中占 4Byte;
// a 在内存中的分布为 0x0 0x0 0x0 0x1;
// 从左到右内存地址降低,也就是低字节地址存放的是 a 的低字节数据
应用:X86 结构、ARM 和 DSP 都是小端存储
测试
进行大小端存储测试主要有两种方法,一种是通过强转,另一种是联合强转测试
int a = 134480385; // 二进制 0000 1000 0000 0100 0000 0010 0000 0001
char *p = (char *)&a; // 一次操作一个字节
printf("%c\n", p[0] + '0');
printf("%c\n", p[1] + '0');
printf("%c\n", p[2] + '0');
printf("%c\n", p[3] + '0');
可以查看 $p[0], p[1], p[2], p[3]$ 的数据判断大小端存储
联合测试
union un {
int i;
char c[4];
}un1 = { 134480385 };
int main() {
printf("%c\n", un1.c[0] + '0');
printf("%c\n", un1.c[1] + '0');
printf("%c\n", un1.c[2] + '0');
printf("%c\n", un1.c[3] + '0');
system("pause");
return 0;
}
可以输出 $c[0],c[1],c[2],c[3]$ 可根据输出判断是大端还是小端存储