关于Big Endian 和 Little Endian

参考:

http://blog.csdn.net/sunshine1314/article/details/2309655

http://stackoverflow.com/questions/19275955/convert-little-endian-to-big-endian


谈到字节序的问题,必然牵涉到两大CPU派系。那就是MotorolaPowerPC系列CPUIntelx86系列CPUPowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?

     
其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。

     用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

Big Endian 符合人类思维习惯

   低地址                              高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   12   |   34   |   56   |   78   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

   低地址                              高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   78   |   56   |   34   |   12   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

     
从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。而little endian!@#$%^&*,见鬼去吧 -_-|||


判断小头还是大头的代码:

#if BYTE_ORDER==__LITTLE_ENDIAN
        printf("little endian\n");
#else
        printf("big endian\n");
#endif

大头转小头 或 小头转大头的代码:

#include <stdio.h>
#include <string.h>

void big_endian_small_endian_swap(int * number) {
        int b0, b1, b2, b3;

        b0 = (*number & 0x000000ff) << 24;
        b1 = (*number & 0x0000ff00) << 8;
        b2 = (*number & 0x00ff0000) >> 8;
        b3 = (*number & 0xff000000) >> 24;

        *number = b0 | b1 | b2 | b3;
}

int main() {

#if BYTE_ORDER==__LITTLE_ENDIAN
        printf("little endian\n");
#else
        printf("big endian\n");
#endif

        int number = 0;
        printf("Input an integer:\n");
        scanf("%d", &number);
        printf("Integer is: %d\n", number);

        big_endian_small_endian_swap(&number);
        printf("Converted integer is: %d\n", number);

        big_endian_small_endian_swap(&number);
        printf("Converted back integer is: %d\n", number);

        return 0;
}

运行结果:

[root@commons02 tmp]# ./t
little endian
Input an integer:
100
Integer is: 100
Converted integer is: 1677721600
Converted back integer is: 100
[root@commons02 tmp]# ./t
little endian
Input an integer:
-100
Integer is: -100
Converted integer is: -1660944385
Converted back integer is: -100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值