C/C++聯合體詳解

代碼如下:

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位。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章