C Primer Plus--位操作

位字段 bit field

位字段是一個signed int或者unsigned int中一組相鄰的位。位字段由一個結構聲明建立,該結構聲明爲每個字段提供標籤,並決定字段的寬度。

struct p {
    unsigned int autfd : 1;//autfd字段佔一個int其中的1位寬度
    unsigned int bldfc : 1;
    unsigned int undln : 1;
    unsigned int itals : 1;
    //字節剩下的位空出
} ;
struct p pt;
pt.autfd = 0;
pt.bldfc = 1;
//...

這裏生命了一個p,其包含四個一位字段。p被存儲在一個usigned int大小的存儲單元中,但僅使用了其中的4位。
字段的位數可以是多位。

 struct pp {
        unsigned int code1 : 2;
        unsigned int code2 : 2;
        unsigned int code3 : 4;
        unsigned int code4 : 1;
    } ;//pp中聲明瞭兩個2位字段,一個4位字段,一個1位字段

pp會佔兩個unsigned int存儲單元,但是隻會按順序使用其中的9位。
如果聲明的位字段總位數超過一個unsigned int空間,像上面那樣,相鄰的下一個unsigned int存儲空間會被利用。但是不允許一個位字段的位數跨越兩個unsigned int的邊界。當出現一個位字段位數跨越了邊界時,編譯器會自動移除掉這個位字段,空出來,就像一個洞一樣,使得邊界對齊。
可以使用未命名的字段填充這樣的洞。當指定未命名位字段寬度爲0時,會使得下一個位字段變量移動到下一個unsigned int邊界開始計算位數。

struct ppp {
        unsigned int field1 : 2;
        unsigned int        : 2;//空出兩位
        unsigned int field2 : 3;//然後纔算field2佔3位
        unsigned int        : 0;//field3必須從下一個unsigned int開始算位數
        unsigned int field3 : 2;
    };

位字段由於在不同機器上可能會有不同的存儲順序,對於字段邊界位置也有區別,因此難以移植。
這樣的結構賦值可以像普通struct那樣進行賦值:

struct {
        unsigned int field1 : 2;
        unsigned int        : 2;//空出兩位
        unsigned int field2 : 3;//然後纔算field2佔3位
        unsigned int        : 0;//field3必須從下一個unsigned int開始算位數
        unsigned int field3 : 2;
    } ppp = {
            1,1,3
    };//需要注意1,1,3按順序值不能超出位字段位數限制

這一章我沒有仔細看。

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