1. 位字段(bit field)是一個signed int或unsigned int中一組相鄰的位(C99還允許_Bool類型位字段)。C使用unsigned int作為給位字段結構分配內存空間的基本單位。位字段由一個結構聲明建立,該結構聲明為每個字段提供標簽,並決定字段的寬度。例如,以下聲明建立了4個1位字段:
struct { unsinged int autfd : 1; unsinged int autfc : 1; unsinged int autfn : 1; unsinged int autfs : 1; } prnt;
該定義使prnt包含4個1位字段。現在,您可以使用普通的結構成員運算符將值賦給單獨的字段:
prnt.itals = 0; prnt.undln = 1;
變量prnt被存儲在一個int大小的存儲單元中(雖然本例只使用了其中的4位)。
2. 帶有位字段結構的結構提供一種保存設置的方便的方法。有時,對於某個設置有兩個以上的選擇,因此您需要用多位來表示所有的選擇。可以使用如下代碼:
struct { unsigned int code1 : 2; unsigned int code2 : 2; unsigned int code3 : 8; } prcode;
可以使用以下方法進行賦值:
prcode.code1 = 0; prcode.code2 = 3; prcode.code3 = 102;
如果所聲明的總位數超過一個unsigned int大小,將會使用下一個unsigned int存儲位置。而且,不允許一個字段跨越兩個unsigned int之間的邊界,編譯器會自動地移位這樣的字段定義,使字段按unsigned int邊界對齊。這時,會留下一個未命名的若干位。
3. 您可以使用未命名的字段主動制造出未命名位。使用一個寬度為0的未命名字段則會迫使下一個字段與下一個unsigned int對齊。例如:
struct { unsigned int filed1 : 1; unsigned int : 2; // 制造出一個2位的空洞 unsigned int filed2 : 1; unsigned int : 0; // 使下一字段偏移到下一個unsinged int位 unsigned int field3 : 3; } stuff;
4. 字段放置到一個int中的順序是依賴於機器實現的。因此,位字段往往難以移植。經典地,應該把它們用於不可移植的用途。
5. 位字段中的字段不可取其地址。
6. 可以使用與初始化普通的結構相同的語法來初始化一個位字段結構:
struct box_props { unsigned int opaque : 1; unsigned int fill_color : 3; unsigned int : 4; unsigned int show_border : 1; unsigned int border_color : 3; unsigned int border_style : 2; unsigned int : 1; } struct box_props box = {1, 1, 1, 2, 2};
類似地,您可以為位字段成員賦值:
box.fill_color = 0;
還可以使用位字段成員作為switch語句的值表達式,也可以用作一個數組索引。
這種方式是賦值默認值
這種方式是賦值默認值