位段以位爲單位定義結構體(或共用體)中成員所佔存儲空間的長度。結構中也允許存在位段、無名字段以及字對齊所需的填充字段。通過在字段的生命後面加一個冒號以及一個表示字段位長的整數來實現。
含有位段的結構體類型稱爲位段結構。位段結構也是一種結構體類型,只不過其中含有以位爲單位定義存儲長度的整數類型位段成員。採用位段結構既節省存儲空間,又可方便操作。
位段結構中位段的定義格式爲:
unsigned <成員名>:<二進制位數>
e.g.
/* 處理ID信息 */
struct pid_tag {
unsigned int inactive : 1;
unsigned int : 1; /* 1個位的填充 */
unsigned int refcount : 6;
unsigned int : 0; /* 填充到下一個字邊界 */
short pid_id;
struct pid_tag *link;
};
位段數據的引用:
同結構體成員中的數據引用一樣,但應注意位段的最大取值範圍不要超出二進制位數定的範圍,否則超出部分會丟棄。
例如:data.a=2; 但 data.a=10;就超出範圍(a佔2位,最大3)
關於位段數據,注意以下幾點:
(1)一個位段必須存儲在同一存儲單元(即字)之中,不能跨兩個單元。如果其單元空間不夠,則剩餘空間不用,從下一個單元起存放該位段。
(2)可以通過定義長度爲0的位段的方式使下一位段從下一存儲單元開始。
(3)可以定義無名位段。
(4)位段的長度不能大於存儲單元的長度。
(5)位段無地址,不能對位段進行取地址運算。
(6)位段可以以%d,%o,%x格式輸出。
(7)位段若出現在表達式中,將被系統自動轉換成整數。