在计算机中数据一般都先存在内存中,(32位机来说)系统为内存的每一个位置都分配了一个地址,地址从0x00000000开始到0xffffffff。
BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型数的数据有关,比如int,short,long型,而对单字节数据byte却没有影响。big-endian就是低位字节排放在内存的高端,高位字节存放在内存的低端。
little-endian正好相反。
比如 int a=
0x05060708,一个int类型数据一般为4个字节(跟具体编译环境有关),用2000,20001,2002,2003表示。
在大端情况下:地址: 数据 在小端情况下: 地址: 数据
2000 05 2000 08
2001 06 2001 07
2002 07 2002 06
2003 08 2003 05
再比如,一个整形数据为a=0x12345678,如果是小端存储,则我们设置一个指针指向这个数据时,这个指针指向的是78,如果相反,则就是高端存储,根据这个解释,我们可以编写如下代码,来测试自己的机器到底是低端存储还是高端存储。
那么对于小端来说,数据0x12345678在内存中的映像是这样子的:
78 0x00000000
56 0x00000001
34 0x00000002
12 0x00000003
小端是低位数据在低地址,像i386(x86)就是这种处理器。
大端正好相反:
12 0x00000000
34 0x00000001
56 0x00000002
78 0x00000003
也就是说大端是低位数据放在高地址,像SuperH4就是这种处理器。
测试大小端代码:
#include
void main()
{
int a=0x12345678;
char *p;
p=(char*)(&a); //取出占用的首地址
if(*p==0x78)
printf("the little endian\n");
else
printf("the big endian\n");
}
方法2:用共用体判断,代码如下:
int check()
{
union w
{
int a;
char b;
}c;
c.a = 1;
return(c.b==1);
}
void main ()
{
if(check() ==1)
printf("the little endian\n");
else
printf("the big endian\n");
}
因为共用体是共用一块内存区域的,我们不妨创建一个包含一个整形和一个字符型的共用体,给共用体的整形数据赋值1,这时我们判断字符变量是不是1,因为字符型变量占据这块内存的低地址,如果是小端类型,这时低地址应该放置地数据1,那么我们通过字符变量就可以显示了。