位字段 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按順序值不能超出位字段位數限制
這一章我沒有仔細看。