1. 程式人生 > >位域(bit fields)簡介

位域(bit fields)簡介

1、簡介

     位域是指資訊在儲存時,並不需要佔用一個完整的位元組, 而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,C語言又提供了一種資料結構,稱為“位域”或“位段”。所謂“位域”是把一個位元組中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程式中按域名進行操作。 這樣就可以把幾個不同的物件用一個位元組的二進位制位域來表示。

2、位域定義

    struct-declarator: 

    declarator 

    type-specifier declarator opt: constant-expression

    與結構定義相仿,其形式為:

  struct 位域結構名

  { 

    位域列表 

  };

  其中位域列表的形式為: 型別說明符 位域名:位域長度

  例如:

  struct bs

  {

    int a:8;

    int b:2;

    int c:6;

  };

3、位域的相關注意事項

  對於位域的定義尚有以下幾點說明:

  1.位域的長度不能大於指定型別固有長度,比如說int的位域長度不能超過32,bool的位域長度不能超過8。

  2.位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:

  struct k

  {

    int a:1;

    int :2;/*該2位不能使用*/

    int b:3;

    int c:2;

  };

  從以上分析可以看出,位域在本質上就是一種結構型別, 不過其成員是按二進位分配的。

        3、位域不能用sizeof運算子進行計算。

4、位域的對齊

  如果結構體中含有位域(bit-field),那麼VC中準則是:

  1) 如果相鄰位域欄位的型別相同,且其位寬之和小於型別的sizeof大小,則後面的欄位將緊鄰前一個欄位儲存,直到不能容納為止;

  2) 如果相鄰位域欄位的型別相同,但其位寬之和大於型別的sizeof大小,則後面的欄位將從新的儲存單元開始,其偏移量為其型別大小的整數倍;

  3) 如果相鄰的位域欄位的型別不同,則各編譯器的具體實現有差異,VC6採取不壓縮方式(不同位域欄位存放在不同的位域型別位元組中),Dev-C++和GCC都採取壓縮方式;

  系統會先為結構體成員按照對齊方式分配空間和填塞(padding),然後對變數進行位域操作。

 struct mybitfields

{

    unsigned short a : 4;

    unsigned short b : 5;

    unsigned short c : 7;

} test;

int main( void );

{

    test.a = 2;

    test.b = 31;

    test.c = 0;

}

the bits would be arranged as follows:

00000001 11110010

cccccccb bbbbaaaa

Since the 8086 family of processors stores the low byte of integer values before the high byte, the integer 0x01F2 above would be stored in physical memory as 0xF2 followed by 0x01.