在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。

目前在各种体系的计算机中通常采用的字节存储机制主要有两种:大端Big-Endian 和 小端Little-Endian

再理解大小端之前,我们先了解下最低、最高有效位。

MSB & LSB

LSB(Least Significant Bit) – 最低有效位

MSB(Most Significant Bit) – 最高有效位

假设一个一字节的数0x9A转换成2进制为1001 1010,那么LSBMSB则应该是这样分布的: 

    MSB                         LSB
    / \                         / \   
   /---\---+---+---+---+---+---/---\   
   | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |   
   +---+---+---+---+---+---+---+---+   

简单理解,好比十进制数字10001,第一个“1”代表万位的单位数值,第二个“1”代表个位的单位数值,显然第一个“1”对整个十进制数的整体数值影响最大,所以类似于最高有效位;同理,第二个“1”对对整个十进制数的整体数值影响最小,所以类似于最低有效位。

字节序

字节序通常是指从计算机存放/取出字节时与先前取出/存放的序列顺序或规则。

大端(Little endian): 指将高位字节存放在内存的低地址端,低位字节放在内存的高地址端。即高字节-->低地址,低字节-->高地址

小端(Big endian): 指将高位字节存放在内存的高地址端,低位字节放在内存的低地址端。即高字节-->高地址,低字节-->低地址

注意:字节序,一定要关注[字节]二字,是以字节为单位的。

假设有一个32位4字节的数,用16进制表示为:0x12345678; 这个数将要从内存地址为0x40000开始存放;当计算机字节序为

大端

内存地址:      0x4000   0x4001   0x4002   0x4003 
            +-------+--------+--------+-------+ 
存储值:      | 0x12  |  0x34  |  0x56  |  0x78 | 
            +-------+--------+--------+-------+

小端

内存地址:      0x4000   0x4001   0x4002   0x4003 
            +-------+--------+--------+-------+ 
存储值:      | 0x78  |  0x56  |  0x34  |  0x12 | 
            +-------+--------+--------+-------+