举例,双字节数0x1234以big-endian的方式存在起始地址0x00002000中:
| data |<-- address | 0x12 |<-- 0x00002000 | 0x34 |<-- 0x00002001
在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):
----+---------------------------------------------------+ bit | 00 01 02 03 04 05 06 07 | 08 09 10 11 12 13 14 15 | ----+MSB---------------------------------------------LSB+ val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 | ----+---------------------------------------------------+ = 0x8B8A
小端模式(little-endian)
little-endian:LSB存放在最低端的地址上。
举例,双字节数0x1234以little-endian的方式存在起始地址0x00002000中:
| data |<-- address | 0x34 |<-- 0x00002000 | 0x12 |<-- 0x00002001
在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0x8B8A为例):
----+---------------------------------------------------+ bit | 15 14 13 12 11 10 09 08 | 07 06 05 04 03 02 01 00 | ----+MSB---------------------------------------------LSB+ val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 | ----+---------------------------------------------------+ = 0x8B8A
c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
网络字节顺序是“所见即所得”的顺序。而Intel类型的CPU的字节顺序与此相反。
比如上面的 short B=0102H(十六进制,每两位表示一个字节的宽度)。所见到的是“0102”,按一般数学常识,数轴从左到右的方向增加,即内存地址从左到右增加的话,在内存中这个 short B的字节顺序是:
01 02
这就是网络字节顺序。所见到的顺序和在内存中的顺序是一致的
我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。 Note:采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。
在ARM体系中,每个字单元包含4个字节单元或者两个半字单元。在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式:big-endian和little-endian格式。在小端模式中,低位字节放在低地址,高位字节放在高地址;在大端模式中,低位字节放在高地址,高位字节放在低地址。
在C语言中,不同于结构体,共用体(联合体)中的几种不同类型的变量存放在同一段内存单元中。利用这一特点,可以用联合体变量判断ARM或x86环境下,存储系统是是大端还是小端模式。
#include "stdio.h" int main() { union w { int a; //4 bytes char b; //1 byte } c; c.a=1; if (c.b==1) printf("It is Little_endian!\n"); else printf("It is Big_endian!\n"); return 1; }