位域使用注意

例:
#include <stdio.h>

int main(void)
{
    /*struct bs
    {
        unsigned a: 1;
        unsigned b: 3;
        unsigned c: 4;
        unsigned d: 24;
        unsigned e: 1;
    }bit, *pbit;*/
    struct bs
    {
        unsigned a: 9;
        //unsigned :0 ;/*空域*/
        //char b:4 ;/*從下一單元開始存放*/
        unsigned c:24;
    }bit, *pbit;
    printf("sizeof(bs) = %d\n", sizeof(bit));
 
  /*bit.a = 1;
    bit.b = 7;
    bit.c = 15;
    printf("%d,%d,%d\n", bit.a, bit.b, bit.c);
    
    pbit = &bit;
    pbit->a = 0;
    pbit->b &= 3;
    pbit->c |= 1;
    printf("%d,%d,%d\n", pbit->a, pbit->b, pbit->c);*/
    return 0;
}

1.a,空域皆爲char時,二者共佔據1字節
   a 爲unsigned,空域爲unsigned; a 爲char,空域爲unsigned; a 爲unsigned,空域爲char;這三種情況,二者共佔據4字節(以unsigned四字節對齊),系統會先結構 體成員按照對齊方式分配空間和填塞(padding),然後對變量進行位域操作。。
2. 位域的長度不能大於其定義類型固有長度,比如說int的位域長度不能超過32(比如你定義一個unsigned a:33;肯定超了),bool的位域長度不能超過8。

3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的,在代碼中不能使用它。

4.注意機器的大小端,這樣算出來的結果可能在高低位地址實際排放的結果會相反。

5.注意有符號數的操作。因爲位域是用原碼對數據操作,而負數是用補碼進行存儲的,對於有符號的數,最好是用無符號unsigned來定義

發佈了17 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章