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]$ 可根据输出判断是大端还是小端存储

Table of Contents