C语言面试题——联合体测cpu的大小端
#include <stdio.h>
int checkCPU();
int main()
{
int a=1;
char * p=(char*)&a;
if(*p==1)
printf("Little edian\n");
else
printf("Big edian\n");
int ret = checkCPU();
printf("%d\n", ret);
return 0;
}
int checkCPU()
{
union w
{
int a;
char b;
}c;
c.a = 1;
return (c.b == 1);
}
上面的一个就是用来测试cpu的大小端的函数,首先联合的概念要弄清楚,可以保存不同类型和长度的变量,编译器负责跟踪对象的长度和对齐要求,并且是在单块存储器中管理不同类型的数据的。上面的联合w在内存的分布如下:
这个不管是在大端还是小端都是这么存储的,接下来就是数据的存放了,还记得“小高高,小弟弟(低低)”吗?c.a=1;编译器就把1写入联合体c中的a,于是在0x22ff44~0x22ff47的地址里写着:
c.b:
在gdb的调试里看到:
一目了然了吧!~