一, 什么是大端和小端
Big-Endian和Little-Endian的定义如下:
1) Little-Endian就是低位字节排列在内存的低地址端,高位字节排放在内存的高地址端
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端
举一个简单的例子, 比如数字0x12 34 56 78在内存中的表示形式为:
二,
数组在大端小端情况下的存储:
以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:Big-Endian: 低地址存放高位,如下:
高地址
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
低地址
Little-Endian: 低地址存放低位,如下:
高地址
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
--------------
低地址
三, 如何判断机器的字节序
如下编写一个小的测试程序来判断机器的字节序:
联合体union的存放顺序是所有成员都从低地址开始存放,而且所有成员公有一块最大的存储空间,
利用该特性可以轻松的获得CPU对内存采用Little-endian还是Big-endian模式都写。
若处理器是Big-Endian的,则返回0;若是Little-Endian的,则返回1
int CheckCPUEndian()
{
{
union w
{
int a;
char b;
}num;
num.a = 1;
return (num.b == 1);
}
}