字节序之大小端与MSB和LSB

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”对对整个十进制数的整体数值影响最小,所以类似于最低有效位。

 

3、字节序

    字节序通常是指从计算机存放/取出字节时与先前取出/存放的序列顺序或规则。一般的将字节序按照字节存储顺序分为大端和小端两种。(听起来可能有点迷糊,后面通过举栗来说明-_-)。

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

 

4、大端(Little endian)

    大端是指将高位字节存放在内存的低地址端,低位字节放在内存的高地址端;

存放顺序记忆:高字节-->低地址,低字节-->高地址

 

5、小端(Big endian)

    小端是指将高位字节存放在内存的高地址端,低位字节放在内存的低地址端;

存放顺序记忆:高字节-->高地址,低字节-->低地址

 

--------------------------------------[我是分割线]-------------------------------------------

6、LSB与MSB举例

开始举栗子:

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

字节序之大小端与MSB和LSB_第1张图片

7、大小端举例

开始举栗子:

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

大端时(它应该是这么存放的):

小端时(它应该是这么存放的):

   顺便将一下最【高有效字节】和【最低有效字节】,其实原理跟MSB和LSB相同,以上面大端存放内容为例,看下面这个图应该就明白了:

字节序之大小端与MSB和LSB_第2张图片

8、如何辨别不同平台的大小端

#include 
int main()
{
    typedef union{
        int a;
        char b;
    }UN_TEST;    /* 定义一个联合体数据类型 */

    UN_TEST d;
    d.a = 1;
    if(d.b == 1)
    {
        printf("Little Endian\n");
    }
    else
    {
        printf("Big Endian\n");
    }

    return 0;
}

    与字节序有很大关联的是数据在网络中传输的“比特序”,这时需要进行字节序与比特序的转换,还会涉及到大小端,下次再进行详细了解。

如果有不妥当的地方,还请大家能够帮我指正。

你可能感兴趣的:(Linux基础)