1. 程式人生 > >C語言面試題——聯合體測cpu的大小端

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的除錯裡看到:

一目瞭然了吧!~