大小端模式

一、大小端

大端模式:内存高地址存放低字节

小端模式:内存低地址存放低字节

例如:Uint32 i = 0x12345678

地址  

大端  

小端   

0x00

12

78

0x01

34

56

0x02

56

34

0x03

78

12

二、为什么分大小端

各有优点

大端:高位在前,便于判断正负和大小;另外,一般芯片发送的接口都是高比特先发送

小端:cpu做数值运算中依次中内存中先去高位数据再到低位数据,计算更加高效

三、现状

x86、arm等芯片一般是小端(由cpu决定)

网络字节使用大端(网络上使用统一的网络字节顺序,可以避免兼容性问题),可以使用htons、htonl转换成网络字节

四、扩展:MSB和LSB(转)

最高有效位(MSB) 
指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的影响。例如,在十进制的15,389这一数字中,相当于万数那1行(1)的数字便对数值的影响最大。比较与之相反的“最低有效位”(LSB)

汇编中,比如8位2进制数10000001,其中第一个1是MSB,第二个1是LSB。在计算机计算的时候用于判断的比如如果是整数那么小数点(实际上是没有小数点的,但就把那一位和下一位之间看作有)在LSB后面,如果是小数小数点在MSB后面,其中MSB在有符号数中又是符号位。

LSB(Least Significant Bit)是“最低有效位”。MSB(Most Significant Bit)是“最高有效位”。

如一个地址:

1(MSB)100 0011(LSB)

在网络通信方面,大家说的更多的是:“Big-Endian”和“Small-Endian”的问题。

指的都是对于多字节的数据类型(比如4字节的32位整数),其多个字节的顺序问题,是最高字节在前(Big-Endian)还是最低字节在前(Small-Endian)。
比如对于123456789这个整数,其16进制为0x075BCD15,那么按照Big-Endian的方式,它在网络上传输(或者在内存里存储)的4个字节依次是:07 4B CD 15,而Small-Endian的顺序正相反,是:15 CD 4B 07。

MSB和LSB虽然跟这个事情看起来有点相似,但不是一回事。通常,一个芯片的管脚中,对于一个多比特的信号,比如32根的地址线,从低开始按0到31编个号。MSB就是31,LSB就是0。那么如果标记为:ADDR[31:0]就是MSB first的方式,如果标记为ADDR[0:31]就是LSB first的方式。

MSB LSB:起始地址为最高位, 最后地址为最低位。

LSB MSB:起始地址为最低位,最后地址为最高位。

比如AD中,8位,最低有效位指D0

程序判断大小端

bool is_little_end(void)

{
    union test
    {
        char cTest[4];
        uint32 test;
    }endTest;

    endTest.cTest[0] = 0x01;
    endTest.cTest[1] = 0x02;
    endTest.cTest[2] = 0x03;
    endTest.cTest[3] = 0x04;

    return (endTest.test > 0x01020304) ? true : false;

}


bool is_little_end(void)

{
    union test
    {
        char a;
        uint32 b;
    }endTest;

    endTest.a = 1;


    return (endTest.b == 1) ? true : false;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值