您的位置:首页 > 其它

关于Big Endian 和 Little Endian

2014-06-29 12:59 399 查看
参考:

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

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

谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: