C中的位段(位域)的使用

 

C中的位段的使用

 

/*
        DATE : 2010.6.24
        關於C中的位端igned或者int
*/
#include <stdio.h>

typedef struct _A
{
        unsigned a:4;//位段成員的類型僅能夠爲unsigned或者int
        unsigned b:4;
        unsigned c:2;
        unsigned d:6;
        unsigned E:1;
        unsigned D:2;
        unsigned T:3;
        unsigned A:9;
        unsigned h:4; //前面已經爲31,故4+31>32已超過一個存儲單元,所以4在一個新的存儲單元存放
        unsigned y:29;//由於前面的4在一個新的存儲單元的開頭存放,且29+4>32, 故在另一個新的存儲單元存放
}A;               //所以最後求出的A的大小是4 + 4 + 4 =12

/*對上面的具體解釋: 一個位段必須存儲在同一個存儲單元中,不能跨兩個單元.如果某存儲單元空間中不能容納
                                    下一個位段,則改空間不用,而從下一個存儲單元起存放該位段. 結構體A中的h和y就是這種情況.
                                        在gcc環境下,測試後,一個存儲單元爲4個字節.
*/

typedef struct _S
{
        unsigned a:4;
        unsigned b:4;
        unsigned c:22;
        unsigned q:1;
        unsigned h:1;
        //unsigned i:33;  // 錯誤:‘i’ 的寬度超過它自身的類型
        //unsigned i:1;當多出此行時,該結構體大小由4變爲8,因爲此行之前正好爲32位
} S;

typedef struct _T
{       //當沒有佔滿一個存儲單元時,結構體的大小對齊爲一個存儲單元的大小
        unsigned a:2;
        unsigned b:2;
        unsigned j:1;
        unsigned : 1;//可以定義無名位段,此例中該無名位段佔用1位的空間,該空間將不被使用
} T;

typedef struct _V
{
        unsigned a:1;
        unsigned b:4;
        unsigned :0;    //定義長度爲0的位段時不能指定名字,否則編譯不過
        unsigned d:1;   //定義了0字段後,緊接着的下一個成員從下一個存儲單元開始存放;
}V;                                     //此例子中,d前面那個存儲單元中的餘下的27位中被0填充了


int main()
{
        A a; S s; T t; V v;
        printf("sizeof(a)=%d\n", sizeof(a));
        printf("sizeof(s)=%u\nsizeof(t)=%u\n", sizeof(s), sizeof(t));
        printf("sizeof(v)=%d\n", sizeof(v));
        return 0;
}


 

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