大端(big_endian):字数据的高字节存储在低地址中,而字数据的低字节存储在高地址中。
小端(little_endian):字数据的高字节存存储在高地址中,而字数据的低字节存储在低字节中。
而对union型成员的存取都是相对于该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址位置开始的。
利用这个特性,我们可以判断当前系统是大端还是小端。
#include
union AA
{
int i;
char a[2];
};
int is_little_endian()
{
union check
{
int i;
char ch;
}c;
c.i = 1;
return (c.ch == 1);
}
int main()
{
int ret;
union AA *p, u;
p = &u;
memset(&u, 0, sizeof(union AA));
p->a[0] = 0x39;
p->a[1] = 0x38;
printf("0x%x\n", p->i);
if(is_little_endian()){
printf("little endian!\n");
}
else{
printf("big endian!\n");
}
return 0;
}
test@test:~/tmp/cbase$ gcc union.c
test@test:~/tmp/cbase$ ./a.out
0x3839
little endian!