1、LSB(Least Significant Bit)--最低有效位

    LSB代表二进制中最小的单位,可以用来指示数字很小的变化。也就是说,LSB是一个二进制数字中的第0位(即最低位),具有权值为2^0,可以用来检测数的奇偶性。

2、MSB(Most Significant Bit)--最高有效位

    MSB代表一个n位二进制数字中的n-1位,具有最高的权值2^(n-1).对于有符号的二进制数,负数采用反码或补码形式,此时MSB用来表示符号,msb为1表示负数,0表示正数。


注意:以上两个概念中“二进制”是关键字眼。另外最高有效位与最低有效位可以用“对整个数值影响最大的位和最小的位来区分最高有效位和最低有效位”,好比十进制数字10001,第一个“1”带表万位的单位数值,第二个“1”代表个位的单位数值,

显然第一个“1”对整个十进制数的整体数值影响最大,所以类似于最高有效位;

同理,第二个“1”对整个十进制数的整体数值影响最小,所以类似于最低有效位。

LSB与MSB举例

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

通常,一个芯片的管脚中,对于一个多比特的信号,比如32根的地址线,从低开始按0到31编个号。MSB就是31,LSB就是0。那么如果标记为:ADDR[31:0]就是MSB first的方式,如果标记为ADDR[0:31]就是LSB first的方式。LSB和MSB是以机器码为单位进行排序。

那么CPU存储一个字节的数据时,其字节内的8个比特之间的顺序是否也有big endian和little endian之分?或者说是否有比特序的不同?

实际上,这个比特序是同样存在的。

MSB LSB:起始地址为最高位, 最后地址为最低位。(大端)

LSB MSB:起始地址为最低位,最后地址为最高位。(小端)

下面以数字0xB4(10110100)用图加以说明。 

低地址----------------------------------------------》高地址

      低地址----------------------------------------------》高地址

实际上,由于CPU存储数据操作的最小单位是一个字节,其内部的比特序是什么样对我们的程序来说是一个黑盒子。也就是说,你给我一个指向0xB4这个数的指针,对于big endian方式的CPU来说,它是从左往右依次读取这个数的8个比特;                      而对于little endian方式的CPU来说,则正好相反,是从右往左依次读取这个数的8个比特。而我们的程序通过这个指针访问后得到的数就是0xB4,字节内部的比特序对于程序来说是不可见的,其实这点对于单机上的字节序来说也是一样的。 

如果是网络传输呢?会不会出问题?是不是也要通过什么函数转换一下比特序?嗯,这个问题提得很好。假设little endian方式的CPU要传给big endian方式CPU一个字节的话,其本身在传输之前会在本地就读出这个8比特的数,然后再按照网络字节序的顺序来传输这8个比特,这样的话到了接收端不会出现任何问题。而假如要传输一个32比特的数的话,由于这个数在littel endian方存储时占了4个字节,而网络传输是以字节为单位进行的,little endian方的CPU读出第一个字节后发送,实际上这个字节是原数的LSB,到了接收方反倒成了MSB从而发生混乱。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐