union與大小端

2021-08-18 09:51:34 字數 1524 閱讀 7037

union是c語言中的乙個關鍵字,它的用法其實與struct很相似。

union中的所有資料成員共用乙個空間,同一時間只能儲存其中的乙個資料成員,並且所有的資料成員有相同的起始位址。例如:

union u

u;

我們可以使用sizeof來檢測一下上面例子的大小,可以發現它的大小是其中最大長度double型別的大小,是8個位元組。

大小端堆union型別資料的影響

首先解釋一下什麼是大小端?

大端(big_endian)字資料的高位元組儲存在低位址中,字資料的低位元組儲存在高位址中。

小端(little_endian)字資料的高位元組儲存在高位址中,字資料的低位元組儲存在低位址中。

union型資料所佔的空間等於其最大的成員所佔的空間,對union型成員的訪問都從相對於該聯合體基位址的偏移量為0開始,也就是說對於聯合體的訪問,不論是哪個變數都是從union的首位址開始,所以機器大小端的不同會對union型的資料產生影響。舉乙個例子:

void test()

*p, u;

p = &u;

p->a[0] = 0x39;

p->a[1] = 0x38;

printf("%x", p->i);

}

這個程式會列印出來什麼資料呢?

通過vs2013測試,發現列印出來的是0xcccc3839。我們開啟記憶體視窗,通過除錯,可以發現記憶體第一行中左邊是低位址,右邊是高位址,而列印出來的資料的高位元組儲存在記憶體的高位址中,低位元組儲存在記憶體的低位址中,由此,也可以判斷,我的電腦是小端。

至於在大端的電腦下執行結果,通過推斷也可以看出來是0x3938cccc

現在有一道題:請寫乙個c函式,若處理器是大端的,則返回0;若是小端的,則返回1。

這道題,我們可以通過聯合體來解決。首先,我們定義乙個int型別的變數,看一下他在記憶體中如何儲存?

}測試發現,結果正確:

用union判斷cpu的大小端

版本1 在arm體系中,每個字單元包含4個位元組單元或者兩個半字單元。在字單元中,4個位元組哪乙個是高位位元組,哪乙個是低位位元組則有兩種不同的格式 big endian和little endian格式。在小端模式中,低位位元組放在低位址,高位位元組放在高位址 在大端模式中,低位位元組放在高位址,高...

利用union判斷系統的大小端

大端模式 所謂的大端模式,是指資料的高位,儲存在記憶體的低位址中,而資料的低位,儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 小端模式 所謂的小端模式,是指資料的高位儲存在記憶體的高位址中,而數 據的低位儲存在記憶體的低位址中,這種...

Union 公用體判斷大小端模式

通過使用union可以知道自己所用的編譯器是大端模式還是小端模式。例1 includeusing namespace std union un u int main else if u.ch 0 輸出位址看一下 cout 號的優先順序高於 運算子,所以加不加括號都是乙個效果。上面的 u.ch和 u....