聯合體巢狀結構體的問題

2021-10-09 17:19:57 字數 1061 閱讀 1378

**:

#include

typedef union

st;}un;

int main()

執行結果是13。

1)注意聯合體的定義,就是組成聯合體的變數共用乙個空間。這個 例子中變數u和st共用乙個空間

2)現在用的pc機大多為小段結構,我的結果13也是在小段機測試的,如果架構改變,結果可能不同

3)基於小段結構,資料的低位元組儲存在記憶體的低位址中,st占用9位(bit),與變數u(32bit)共用低位的9位

4)根據小段結構,變數a的位址應該最低,往後依次是b,c,d

5)un.u = 0; 執行這一步,變數所對應的空間二進位制全部為0,即00000000 00000000 00000000 00000000

6)un.st.a = 1;執行這一步,變數最後一位變化,即00000000 00000000 00000000 00000001

7)un.st.b = 2;執行這一步,由於1位空間無法儲存2,所以賦值被截斷,原值不變

8)un.st.c = 3;執行這一步,變數第3-8位發生變化,變數值變為00000000 00000000 00000000 00001101

9)un.st.d = 4;執行這一步,由於1位空間無法儲存4,所以賦值被截斷,原值不變

10)所以最終的結果就是00000000 00000000 00000000 00001101

11)printf("%d\n", un.u); 輸出結果就是13

能解釋下「由於1位空間無法儲存2,所以賦值被截斷」是什麼意思嗎?

結構中的u和st是共用一段記憶體,所以你修改了u,則st的內容自動變化,同樣如果你修改了st的內容,則u的內容也自動變化.這就是聯合體

unsigned char a :1;這種定義方式,是按位進行定義的,即a只占用乙個位,同樣b和d都只占用一位,所以如果這三個變數你賦值大於1的話,則自動被截斷為1位,即除了低1位有效之外,其它高位的全部被丟棄。按位定義的,和這個變數的型別相關性不是很大,所以不是說a被定義成char就是8位。

由於是聯合體,所以你的main()中對u賦值之後,再對a\b\c\d賦值,結果u就被修改掉了

結構體聯合體

在c中,結構也是一種資料型別,可以使用結構變數,因此,象其它型別的變數一樣,在使用結構變數時要先對其定義。定義結構變數的一般格式為 struct 結構名 結構變數 結構名是結構的識別符號不是變數名。型別為第二節中所講述的五種資料型別 整型 浮點型 字元型 指標型和無值型 構成結構的每乙個型別變數稱為...

聯合體 位域結構體 聯合體的妙用

在c語言中,變數的定義是分配儲存空間的過程。一般的,每個變數都具有其獨有的儲存空間,那麼可不可以在同乙個記憶體空間中儲存不同的資料型別 不是同事儲存 呢?答案是可以的,使用聯合體就可以達到這樣的目的。聯合體也叫共用體,在c語言中定義聯合體的關鍵字是union。定義乙個聯合型別的一般形式為 union...

結構體 聯合體 列舉

1 結構體struct 結構體的作用 在網路協議 通訊控制 嵌入式系統的c c 程式設計中,我們要傳送的不是簡單的位元組流 char型陣列 二是多種資料組合起來的乙個整體,其表現形式是乙個結構體。使用struct的注意事項 1 下面看乙個題目 結果 6 12 這裡涉及到結構體的記憶體對齊方式。1 關...