字节序

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

在几乎所有的机器上，多字节对象都被存储为连续的字节序列。例如在C语言中，一个类型为int的变量x地址为0x100，那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在電腦記憶體的0x100, 0x101, 0x102, 0x103位置。

字节的排列方式有两个通用规则。例如，将一个多位数的低位放在较小的地址处，高位放在较大的地址处，则称小端序；反之则称大端序。在网络应用中，字节序是一个必须被考虑的因素，因为不同机器类型可能采用不同标准的字节序，所以均按照网络标准转化。

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

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

1980年，丹尼·科恩（Danny Cohen），一位网络协议的早期开发者，在其著名的论文"On Holy Wars and a Plea for Peace"中，为平息一场关于字节该以什么样的顺序传送的争论，而第一次引用了该词。

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

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

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

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

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

 数据以8bit为单位:

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

 数据以16bit为单位:

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

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

 数据以8bit为单位:

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

 数据以16bit为单位:

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

 更改地址的增长方向:

当更改地址的增长方向，使之由右至左时，表格更具有可阅读性。

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

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

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

 32bit在PDP-11的存储方式

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

处理器体系 
 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和32bit整数在网络序和本机字节序之间的转换。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

電腦架構