字节存储顺序,简称字节序,又称端序或尾序(英语:Endianness)。是指多字节数据在计算机内存中的存储顺序(即主机字节序);在网络传输时各字节的存储顺序(即网络字节序)。
影响的是多字节类型的数据,比如int,short,long型,而对单字节数据 byte 却没有影响,大部分处理器以相同的顺序处理位元(bit),因此单字节的存放方法和传输方式一般相同。
如果最低有效位在最高有效位的前面,则称小端序;反之则称大端序。
例如在C语言中,一个类型为 int 的变量x地址为0x100,它的十六进制为0x01234567, 那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在内存的0x100, 0x101, 0x102, 0x103位置。而存储的顺序有两种规则:
0x01234567:
0x01是高位,0x67是低位
地址的分布:
0x100、0x101、0x102、0x103
0x100是低地址,0x103是高地址
小端序:
最低有效位在最高有效位的前面,也就是数值的低位存储在内存的低地址,高位存储在内存的高地址。
存储的顺序是:
0x67 0x45 0x23 0x01
大端序:
数值的高位存储在内存的低地址,低位存储在内存的高地址。
存储的顺序是:
0x01 0x23 0x45 0x67
网络字节序:
网络传输一般采用大端序,也被称之为网络字节序,或网络序。IP协议中定义大端序为网络字节序。
IP地址的表示顺序
不同的系统在内存存储多字节数据的方式有所不同,而在网络传输中,数据存储顺序不一定和系统存储顺序一样,因此为保证系统正确性和可移植性,需要利用系统的转换函数进行转换。以Ipv4的地址为例,一个IP地址的四个字节“192.168.1.100”,在PC架构的计算机中,数据的表示是低位优先(little-endian),由前至后是100、1、168、192;而在网络Socket协议所表示的网络传输中,则是高位优先(big-endian),由前至后是192、168、1、100,这需要在处理时通过函数转化。
不同处理器体系与大小端序的对应关系:
Intel架构x86、AMD架构,MOS Technology 6502,Z80,VAX,PDP-11等处理器为Little endian小端序。
Motorola 6800,Motorola 68000,PowerPC 970,System/370,SPARC(除V9外)等处理器为Big endian大端序。
ARM, PowerPC (除PowerPC 970外), DEC Alpha, SPARC V9, MIPS, PA-RISC and IA64的字节序是可自行配置成大端或小端序。