代碼如下:
typedef union
{
unsigned int u;
struct
{
unsigned char a :1;
unsigned char b :1;
unsigned char c :6;
unsigned char d :1;
} ST;
}UN;
int main()
{
UN un;
un.u = 0;
un.ST.a = 1;
un.ST.b = 2;
un.ST.c = 3;
un.ST.d = 4;
printf("%d\n", un.u);
return 0;
}
運行結果是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
unsigned char a :1;這種定義方式,是按位進行定義的,即a只佔用一個位,同樣b和d都只佔用一位,所以如果這三個變量你賦值大於1的話,則自動被截斷爲1位,即除了低1位有效之外,其它高位的全部被丟棄。按位定義的,和這個變量的類型相關性不是很大,所以不是說a被定義成char就是8位。