字节序

端序（），又稱字节顺序，又稱尾序，在计算机科学领域中，指電腦記憶體中或在数字通信链路中，组成多字节的字的字节的排列顺序。

在几乎所有的机器上，多字节对象都被存储为连续的字节序列。例如在C语言中，一个类型为int的变量x地址为0x100，那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在電腦記憶體的0x100, 0x101, 0x102, 0x103位置。《深入理解计算机系统》 第2章 信息的表示和处理 P26.

端序分为大端序（Big Endian）和小端序（Little Endian）两种。其中小端表示将低位字节数据存储在低地址的模式、大端表示将高位字节数据存储在低地址的模式。

例如假设上述变量x类型为int，位于地址0x100处，它的值为0x01234567，地址范围为0x100~0x103字节，其内部排列顺序依赖于机器的类型。大端法从首位开始将是：0x100: 0x01, 0x101: 0x23, 0x102: 0x45, 0x103: 0x67。而小端法将是：0x100: 0x67, 0x101: 0x45, 0x102: 0x23, 0x103: 0x01。

 端（endian）的起源 
“endian”一词来源于十八世紀愛爾蘭作家乔纳森·斯威夫特（Jonathan Swift）的小说《格列佛游记》（）。小说中，小人国为水煮蛋该从大的一端（Big-End）剥开还是小的一端（Little-End）剥开而争论，争论的双方分别被称为“大端派（Big-Endians）”和“小端派（Little-Endians）”。以下是书中关于大小端之争历史的描述：

1980年，丹尼·科恩（Danny Cohen），一位网络协议的早期开发者，在其著名的论文"On Holy Wars and a Plea for Peace"中，为平息一场关于字节该以什么样的顺序传送的争论，而第一次引用了该词。《深入理解计算机系统》 第2章 信息的表示和处理 P27.

 字节顺序 
在哪种字节顺序更合适的问题上，人们表现得非常情绪化，实际上，就像鸡蛋的问题一样，没有技术上的原因来选择字节顺序规则，因此，争论沦为关于社会政治问题的争论，只要选择了一种规则并且始终如一地坚持，其实对于哪种字节排序的选择是任意的。

对于单一的字节（a byte），大部分处理器以相同的顺序处理位元，因此单字节的存放方法和传输方式一般相同。

对于多字节数据，如整数（32位机中一般占4字节），在不同的处理器的存放方式主要有两种，以内存中0x0A0B0C0D的存放方式为例，分别有以下几种方式：

 注: 0x前缀代表十六进制。

 大端序 
大端序（英：big-endian）或稱大尾序。

right

 数据以8位元为单位:

地址增长方向  → ... 0x0A 0x0B 0x0C 0x0D ...

示例中，最高位字节是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。

 数据以16位元为单位:

地址增长方向  → ... 0x0A0B 0x0C0D ...

最高的16位元单元0x0A0B存储在低位。

 小端序 
小端序（英：little-endian）或稱小尾序。

right

 数据以8位元为单位:

地址增长方向  → ... 0x0D 0x0C 0x0B 0x0A ...

最低位字节是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。

 数据以16位元为单位:

地址增长方向  → ... 0x0C0D 0x0A0B ...

最低的16位元单元0x0C0D存储在低位。

 更改地址的增长方向:

当更改地址的增长方向，使之由右至左时，表格更具有可阅读性。但是需要注意可能產生位元組的位元依小端序排列的誤讀。

←  地址增长方向 ... 0x0A 0x0B 0x0C 0x0D ...

最低有效字節（LSB）是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。

←  地址增长方向 ... 0x0A0B 0x0C0D ...

最低的16位元单元0x0C0D存储在低位。

 混合序 
混合序（英：middle-endian）具有更复杂的顺序。以PDP-11为例，0x0A0B0C0D被存储为：

 32位元在PDP-11的存储方式

地址增长方向  → ... 0x0B 0x0A 0x0D 0x0C ...

可以看作高16位元和低16位元以大端序存储，但16位元内部以小端存储。

 处理器体系 
 x86、MOS Technology 6502、Z80、VAX、PDP-11、RISC-V等处理器为小端序；
 Motorola 6800、Motorola 68000、PowerPC 970、System/370、SPARC（除V9外）等处理器为大端序；
 ARM、PowerPC（除PowerPC 970外）、DEC Alpha、SPARC V9、MIPS、PA-RISC及IA64的字节序是可配置的。

 网络序 
网络传输一般采用大端序，也被称之为网络字节序，或网络序。IP协议中定义大端序为网络字节序。

Berkeley套接字定义了一组转换函数，用于16和32位元整数在网络序和本机字节序之间的转换。htonl，htons用于本机序转换到网络序；ntohl，ntohs用于网络序转换到本机序。

 位序 
一般用于描述串行设备的传输顺序。网络协议中只有数据链路层的底端会涉及到。

小端序（先传低位）的串行协议
 RS-232
 RS-422
 RS-485
 USB
 以太网（虽然高字节先传，但每一字节内低位先传）

大端序（先传高位）的串行协议
 I2C协议
 SPI协议
 摩尔斯电码

 参见 
 最高有效位
 最低有效位
 网络协议

参考資料

 外部链接 
 Endian的由来 
 White Paper: Endianness or Where is Byte 0?
 Byte Ordering PPC 
 The Layout of Data in Memory
 Writing endian-independent code in C 
 How to convert an integer to little endian or big endian 
 Understanding big and little endian byte order
 Mandatory reading: ON HOLY WARS AND A PLEA FOR PEACE

Category:電腦架構