关于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,!@#$%^&*,见鬼去吧 -_-|||
判断小头还是大头的代码:
大头转小头 或 小头转大头的代码:
运行结果:
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
相关文章推荐
- 关于 Big endian 和 Little endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian 和 Little Endian
- 关于字节序Big Endian和Little Endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian和Little Endian
- 关于Big Endian 和 Little Endian
- 字节顺序的详细解释--关于Big endian和 Little endian
- 关于Big Endian 和 Little Endian
- 关于Big Endian 和 Little Endian
- 点点滴滴——计算机基础little endian 和big endian