字节序之大小端与MSB和LSB

一、LSB(Least Significant Bit)--最低有效位网络

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

 

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

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

 

注意:以上两个概念中“二进制”是关键字眼。另外最高有效位与最低有效位能够用“对整个数值影响最大的位和最小的位来区分最高有效位和最低有效位”,比如十进制数字10001,第一个“1”带表万位的单位数值,第二个“1”表明个位的单位数值,显然第一个“1”对整个十进制数的总体数值影响最大,因此相似于最高有效位;同理,第二个“1”对对整个十进制数的总体数值影响最小,因此相似于最低有效位。it

 

三、字节序io

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

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

 

四、大端(Little endian)原理

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

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

 

五、小端(Big endian)

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

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

 

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

六、LSB与MSB举例

开始举栗子:

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

七、大小端举例

开始举栗子:

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

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

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

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

八、如何辨别不一样平台的大小端

#include <stdio.h>
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;
}

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

若是有不稳当的地方,还请你们可以帮我指正。