字节顺序

字节存储顺序,简称字节序,又称端序或尾序(英语: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的字节序是可自行配置成大端或小端序。

你可能感兴趣的:(字节顺序)