字节顺序,又称端序或尾序 ( Endianness ),是跨越多字节的程序对象的存储规则。
在几乎所有的机器上,多字节对象都被存储为连续的字节序列。
存储地址内的排列有两个通用规则,一个多位的整数将按照其存储地址的最低或最高字节排列。
- 大端序 ( Big-Endian ),高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
- 小端序 ( Little-Endian ),低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
举一个例子,比如数字 0x12345678
在内存中的表示形式为:
- 大端模式:
低地址 -----------------> 高地址
高字节 -----------------> 低字节
0x12 | 0x34 | 0x56 | 0x78
- 小端模式:
低地址 -----------------> 高地址
低字节 -----------------> 高字节
0x78 | 0x56 | 0x34 | 0x12
大端模式:符号位的判定固定为第一个字节,容易判断正负。
小端模式:强制转换数据不需要调整字节内容,高地址端只需补零。
在网络应用中,字节序是一个必须被考虑的因素。因为不同机器类型可能采用不同标准的字节序,均要按照网络标准进行端模式的转换。一般操作系统是小端,而通讯协议是大端的。
- PowerPC处理器主导网络市场,可以说绝大多数的通信设备都使用PowerPC处理器进行协议处理和其他控制信息的处理,这也可能也是在网络上的绝大多数协议都采用大端编址方式的原因。因此在有关网络协议的软件设计中,使用小端方式的处理器需要在软件中处理端模式的转变。
- Pentium主导个人机市场,因此多数用于个人机的外设都采用小端模式,包括一些在网络设备中使用的PCI总线,Flash等设备,这也要求在硬件设计中注意端模式的转换。
- 对于有些设备,如DDR颗粒,没有以小端方式存储的寄存器,因此从逻辑上讲并不需要对端模式进行转换。只需要将双方数据总线进行一一对应的互连,而不需要进行数据总线的转换。
虽然很多时候,字节序的工作已由编译器完成了,但是在一些小的细节上,仍然需要去仔细揣摩考虑,尤其是在以太网通讯、MODBUS通讯、软件移植性方面。