大小端存储的概念和判断
大小端(Endianness)是指在计算机内存中存储多字节数据(如整数、浮点数等)时,字节的排列顺序。这种排列顺序对于数据的存储、传输和处理非常重要,尤其是在跨平台通信和多语言编程中。
1. 大端(Big-Endian)
-
定义:大端模式是指高位字节存放在内存的低地址端,低位字节存放在内存的高地址端。
-
特点:这种排列方式与人类阅读数字的习惯一致(从高位到低位),因此被称为“大端”。
-
示例: 假设有一个 32 位整数
0x12345678
,在大端模式下,其存储顺序为:内存地址: 0x00 0x01 0x02 0x03 存储内容: 12 34 56 78
2. 小端(Little-Endian)
-
定义:小端模式是指低位字节存放在内存的低地址端,高位字节存放在内存的高地址端。
-
特点:这种排列方式与人类阅读数字的习惯相反,因此被称为“小端”。
-
示例: 同样假设有一个 32 位整数
0x12345678
,在小端模式下,其存储顺序为:内存地址: 0x00 0x01 0x02 0x03 存储内容: 78 56 34 12
如何判断系统是大端存储还是小端存储,定义一个字符变量,让它超过字符变量的字节长度,后来的会覆盖前面的,
char a = 0x12345678;
printf("%x", a);
如果是大端输出会是78,小端为12,当然,这个办法其实有点语法错误,毕竟char只有1个字节。
int isLittleEndian() {
unsigned int x = 1;
return !((char *)&x)[0]; // 如果低地址存储的是高位字节,则返回 0(大端)
}
可以这样写,
定义一个 unsigned int
类型的变量 x
,并赋值为 1
。
在小端模式下,x
的内存布局为:01 00 00 00
,因此 ((char *)&x)[0]
的值为 1
。
在大端模式下,x
的内存布局为:00 00 00 01
,因此 ((char *)&x)[0]
的值为 0
。