浅析大端字节序和小端字节序以及LSB和MSB

本文主要是帮助理解字节序的意义和用法,方便在日后处理数据能够正确读取;

理解大端字节序和小端字节序

计算机硬件有两种存储数据的方法:

  1. 大端字节序(big endian):高位字节在前,低位字节在后,这是人类读写数值的方法;
  2. 小端字节序(little endian):低位字节在前,高位字节在后,即以0x1122形式储存;
    举例来说:数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。

两种字节序在CPU中的表示方法

0x1234567在CPU种两种字节序的写法如下:
浅析大端字节序和小端字节序以及LSB和MSB

LSB和MSB

  • LSB:最低有效位,指二进制中最高值的比特;
  • MSB:最高有效位,指二进制中最高值的比特;
    例如:0xFE,转换成二进制为:1111 1110,它的LSB即为0,MSB为1。

在大端字节序和小端字节序种LSB和MSB的情况

下面以数字0xB4(10110100)用图加以说明;
浅析大端字节序和小端字节序以及LSB和MSB

字节序为什么有大小端之分

  1. 硬件原因
    谈到字节序的问题,必然牵涉到两大CPU派系,那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。
  2. 效率
    计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读第一个字节,再读第二个字节。如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节,小端字节序正好相反。计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。
  3. 思维习惯
    采用big endian方式存储数据是符合我们人类的思维习惯的。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存,而且所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。

总结

在我们编程中,如果只是单机环境下运行的,字节序可以不用在意,但是一旦涉及到通信、和其他的机器或程序交互时,就要注意字节序的模式,是大端还是小端。
C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而Java编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的Java程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了Java程序,由于Java采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412(CPU存储数据操作的最小单位是一个字节)。

引用

  1. https://blog.****.net/qq_22279697/article/details/80508624
  2. https://www.cnblogs.com/gremount/p/8830707.html