程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 位字段,字段

位字段,字段

編輯:C++入門知識

位字段,字段


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語句的值表達式,也可以用作一個數組索引。


位字段問題

這種方式是賦值默認值
 

位字段問題

這種方式是賦值默認值
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved