位段以位為單位定義結構體(或共用體)中成員所佔儲存空間的長度。含有位段的結構體型別稱為位段結構。
位段結構也是一種結構體型別,只不過其中含有以位為單位定義儲存長度的整數型別位段成員。採用位段結構既節省儲存空間,又可方便操作。
位段結構中位段的定義格式為:
unsigned 《成員名》:《二進位制位數》
例如:
struct bytedata
data;
位段資料的引用:
同結構體成員中的資料引用一樣,但應注意位段的最大取值範圍不要超出二進位制位數定的範圍,否則超出部分會丟棄。
例如:data.a=2; 但 data.a=10;就超出範圍(a佔2位,最大3)
關於位段資料,注意以下幾點:
(1) 乙個位段必須儲存在同一儲存單元(即字)之中,不能跨兩個單元。如果其單元空間不夠,則剩餘空間不用, 從下乙個單元起存放該位段。
(2)可以通過定義長度為0的位段的方式使下一位段從下一儲存單元開始。
(3)可以定義無名位段。
(4)位段的長度不能大於儲存單元的長度。
(5)位段無位址,不能對位段進行取位址運算。
(6)位段可以以%d,%o,%x格式輸出。
(7)位段若出現在表示式中,將被系統自動轉換成整數。
1、位段成員只有三種型別:int ,unsigned int 和signed int這三種.
2、成員名後面的乙個冒號和乙個整數,這個整數指定該位段的位長(bit);
3、許多編譯器把位段成員的字長限制在乙個int的長度範圍之內;
4、位段成員在記憶體的實現是從左到右還是從右到左是由編譯器來決定的,但二者皆對。
位段使用示例:
假定, 其中三個用作標誌, 稱為 f1, f2 和 f3。
第四個稱為 type, 取值範圍為 1 至 12。
最後乙個變數稱為 index, 值的範圍為 0 至 500。
通常, 我們用下面的語句來說明這些變數:
char f1,f2,f3;
unsigned int type;
unsigned int index; // 共需要3+4+4=11byte
現在使用位段:
struct packed_struct ; //兩個byte就可以了
當位段出現在結構定義中時, 它們就被壓縮成字。如果某個位段無法放入乙個字中, 那麼該字的剩餘部分跳過不用, 該
位段被放入下乙個字中。
使用位段時, 必須注意下列事項:
1)在某些機器上, 位段總是作為 unsigned 處理, 而不管它們是否被說明成 unsigned 的。
2)大多數c 編譯器都不支援超過乙個字長的位段。
3)位段不可標明維數; 即, 不能說明位段陣列, 例如 flag:l[2]。
4)最後, 不可以取位段位址。原因是, 在這種情況不, 顯然沒有稱作為 "位段指標" 型別的變數。
C語言位域(位段)詳解
有些資料在儲存時並不需要占用乙個完整的位元組,只需要占用乙個或幾個二進位制位即可。例如開關只有通電和斷電兩種狀態,用 0 和 1 表示足以,也就是用乙個二進位。正是基於這種考慮,c語言又提供了一種叫做位域的資料結構。在結構體定義時,我們可以指定某個成員變數所占用的二進位制位數 bit 這就是位域。請...
C語言之位段使用詳解
在前面各章中,我們已經討論過位元組概念了。在大多數的計算機系統中,乙個位元組是由八個更小的,稱作為位的單位組成的。位是比位元組更小的單位。位只有兩個值,1 或 0 因此,儲存在計算機儲存器中的乙個位元組可以看成由八個二進位制數字形成的串。例如,乙個存放值 36 的位元組是八個二進位制數字的串 可以表...
c語言 位段
位段 位段的宣告和結構是類似的,有兩個不同 1 位段的成員必須是int unsigned int char 或 signed int。2 位段的成員後邊有乙個冒號和乙個數字。例子 include include struct a struct b struct c int main 經過 驗證 1 ...