C語言面試題——聯合體測cpu的大小端
阿新 • • 發佈:2019-02-13
#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的除錯裡看到:
一目瞭然了吧!~