(深入理解计算机系统)大端模式和小端模式
Big-Endian大端模式和Little-Endian小端模式
定义
- Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
- Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
- 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序.
- 高/低字节定义:在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78.
例子分析:
unsigned int value = 0x12345678
1.Big-Endian: 低地址存放高位
栈底 (高地址) | ||
---|---|---|
buf[3] | (0x78) | 低位 |
buf[2] | (0x56) | |
buf[1] | (0x34) | |
buf[0] | (0x12) | 高位 |
栈顶 (低地址) |
2.Little-Endian: 低地址存放低位
栈底 (高地址) | ||
---|---|---|
buf[3] | (0x12) | 高位 |
buf[2] | (0x34) | |
buf[1] | (0x56) | |
buf[0] | (0x78) | 低位 |
栈 顶 (低地址) |
在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
---|---|---|---|---|
存放内容 | 0x78 | 0x56 | 0x34 | 0x12 |
在Big- endian模式CPU内存中的存放方式则为
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
---|---|---|---|---|
存放内容 | 0x12 | 0x34 | 0x56 | 0x78 |
注意:通常我们说的主机序(Host Order)就是遵循Little-Endian规则。所以当两台主机之间要通过TCP/IP协议进行通信的时候就需要调用相应的函数进行主机序 (Little-Endian)和网络序(Big-Endian)的转换。
检查CPU是大端还是小端:
int checkCPU(void)
{
union
{
int a;
char b;
}c;
c.a = 1;
return (c.b == 1);
}
【最是那一低头的温柔】
【好像水莲花不胜凉风的娇羞】