C語言union 關鍵字與大小端模式

2021-07-10 01:55:20 字數 1896 閱讀 3873

union 關鍵字的用法與struct 的用法非常類似。

union 維護足夠的空間來置放多個資料成員中的「一種」,而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下:

union statemachine

;

乙個union 只配置乙個足夠大的空間以來容納最大長度的資料成員,以上例而言,最大長度是double 型態,所以statemachine 的空間大小就是double 資料型別的大小。

在c++裡,union 的成員預設屬性頁為public。union 主要用來壓縮空間。如果一些資料不可能在同一時間同時被用到,則可以使用union。

下面再看乙個例子:

union

*p, u;

p =&u;

p->a[0] = 0x39;

p->a[1] = 0x38;

p.i 的值應該為多少呢?

這裡需要考慮儲存模式:大端模式和小端模式。

大端模式(big_endian):字資料的高位元組儲存在低位址中,而字資料的低位元組則存放在高位址中。

小端模式(little_endian):字資料的高位元組儲存在高位址中,而字資料的低位元組則存放在低位址中。

union 型資料所佔的空間等於其最大的成員所佔的空間。對union 型的成員的訪問都是相對於該聯合體基位址的偏移量為0 處開始,也就是聯合體的訪問不論對哪個變數的訪問都是從union 的首位址位置開始。如此一解釋,上面的問題是否已經有了答案呢?

上述問題似乎還比較簡單,那來個有技術含量的:請寫乙個c 函式,若處理器是big_endian 的,則返回0;若是little_endian 的,則返回1。

先分析一下,按照上面關於大小端模式的定義,假設int 型別變數i 被初始化為1。

以大端模式儲存,其記憶體布局如下圖:

以小端模式儲存,其記憶體布局如下圖:

變數i 佔4 個位元組,但只有乙個位元組的值為1,另外三個位元組的值都為0。如果取出低位址上的值為0,毫無疑問,這是大端模式;如果取出低位址上的值為1,毫無疑問,這是小端模式。既然如此,我們完全可以利用union 型別資料的特點:所有成員的起始位址一致。

到現在,應該知道怎麼寫了吧?參***如下

int checksystem( )

c; c.i = 1;

return (c.ch ==1);

}

現在你可以用這個函式來測試你當前系統的儲存模式了。當然你也可以不用函式而直接去檢視記憶體來確定當前系統的儲存模式。如下圖:

圖中0x01 的值存在低位址上,說明當前系統為小端模式。

不過要說明的一點是,某些系統可能同時支援這兩種儲存模式,你可以用硬體跳線或在編譯器的選項中設定其儲存模式。

留個問題:在x86 系統下,輸出的值為多少?

#include 

int main()

; int

*ptr1=(int

*)(&a+1);

int*ptr2=(int

*)((int)a+1);

printf("%x,%x",ptr1[-1],*ptr2);

return

0;}

C語言union關鍵字

union 關鍵字的用法與struct 的用法非常類似。union 維護足夠的空間來置放多個資料成員中的 一種 而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下 union statemachin...

C語言union關鍵字

今天看union,不是很記得其作用了。本文摘自c語言中文網,解釋的很好,學到了東西。union 維護足夠的空間來置放多個資料成員中的 一種 而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下 uni...

C語言union關鍵字

union 關鍵字的用法與struct 的用法非常類似。union 維護足夠的空間來置放多個資料成員中的 一種 而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下 union statemachin...