Big endian和Little enddian的代表就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。两者主要不同在于存放数据顺序的不同。
所谓Big endian就是从低地址到高地址存放高字节到低字节,地址第一个字节是高字节,但是Little endian恰恰相反,从低地址到高地址存放低字节到高字节,地址第一个字节是低字节。
如:int a = 0x1234abcd;如果是little endian就是低地址到高地址0xcd-0xab-0x34-0x12;而Big little相反,低地址开始0x12-0x34-0xab-0xcd。两种不同的存储方式,
1,判别大小端
int CheckCPU()
{
{
union Check
{
int a;
char b;
} c;
c.a = 2;
return (c.b == 2);
}
}
这个函数,如果是Big endian就返回0;Little endian返回1;
因为联合体是共用一段内存的,先用int a =2,4字节,然后用char占用1字节,高位3字节被冲掉了(联合体新值会冲去旧值),这个时候剩下的1字节是低地址。如果是little endian就会有数字,因为little endian是低地址存低字节,高地址存高字节。但如果是big endian就没有数字,Big little是低地址存高字节,高地址存低字节,高地址的踢出意味着数字的消失。
[root@jsetc ~]# vim 1.c
[root@jsetc ~]# gcc 1.c -o 1
[root@jsetc ~]# ./1
1
结果,因为是x86平台的cpu,所以理所当然就是little endian了。
2,交换大小端
主要通过移位来完成,a&0x000000ff得到0x000000cd,然后将值左移24位送到高地址,得0xcd000000(因为优先级要叫括号)。