+----------+
| 0x34 |<-- 0x00000021
+----------+
| 0x12 |<-- 0x00000020
+----------+
图 1:双字节数0x1234以Big-Endian的方式存在起始地址0x00000020中
+----------+
| 0x12 |<-- 0x00000021
+----------+
| 0x34 |<-- 0x00000020
+----------+
图3:双字节数0x1234以Little-Endian的方式存在起始地址0x00000020中
总结一下两种方法:
1.直接根据地址判断
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
static int isBigEndian()
{
uint32_t thisx = 0x04030201;
uint8_t *thisp = (uint8_t *)&thisx;
return (*thisp == 1) ? 1:0;
}
int main(int argc,char **argv)
{
printf("Byte order:%s Endian\n",!isBigEndian()?"Little":"Big");
return 0;
}
2.根据联合体union的存放顺序是所有成员都从低地址开始存放这个特点判断
#include<stdio.h>
int checkCPU()
{
union w
{
int a;
char b;
}c;
c.a = 1;
return(c.b == 1);//Little-endian:return 1
}
int main(int argc,char **argv)
{
printf("Byte order:%s Endian\n",checkCPU()?"Little":"Big");
return 0;
}