大端小端字节序
大端小端字节序
在计算机中,多字节对象被存储在连续的字节序列中,这就引出了存储字节顺序的问题。这一概念就被称为主机字节序。
主机字节序分为两种模式:
- 大端字节序(Big Endian):高位字节存储在低位地址,低位字节存储在高位地址。
- 小端字节序(Little Endian):低位字节存储在低位地址,高位字节存储在高位地址。
例如对于int n = 0x01020304
,假设int
大小为4字节,并且该int
对象的地址为0x100,那么在大端机器和小端机器上内存布局如下图:
内存地址 | 0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|---|
大端字节序 | 0x01 | 0x02 | 0x03 | 0x04 |
小端字节序 | 0x04 | 0x03 | 0x02 | 0x01 |
判断主机字节序
主机字节序不是由操作系统决定的,而是由CPU指令集架构决定的。各架构处理器的字节序如下:
- x86(Intel、AMD)、MOS Technology 6502、Z80、VAX、PDP-11 等处理器为小端序。
- Motorola 6800、Motorola 68000、PowerPC 970、System/370、SPARC(除 V9 外)等处理器为大端序。
- ARM(默认小端序)、PowerPC(除 PowerPC 970 外)、DEC Alpha、SPARC V9、MIPS、PA-RISC 及 IA64 的字节序是可配置的。
可以自己写一个简单的程序判断当前的主机字节序。
#include <stdio.h>
#include <stdint.h>
union byte_order
{
int32_t whole;
int8_t parts[4];
};
int is_little_endian()
{
union byte_order bo = {.whole = 0x01020304};
return bo.parts[0] == 0x04;
}
int main(void)
{
if (is_little_endian())
{
printf("Little Endian Machine\n");
}
else
{
printf("Big Endian Machine\n");
}
return 0;
}
网络字节序
网络字节序是 TCP/IP 中规定的字节顺序,它与具体的 CPU 类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。
在TCP/IP中规定网络字节序就是大端字节序。