C 位元域


如果程式的結構中包含多個開關量,只有TRUE/FALSE 變量,如下:

struct{  unsigned int widthValidated;  unsigned int heightValidated;} status;

這種結構需要8 個位元組的記憶體空間,但在實際上,在每在變數中,我們只儲存0 或1。在這種情況下,C 語言提供了一中更好的利用記憶體空間的方式。如果您在結構內使用這樣的變量,您可以定義變數的寬度來告訴編譯器,您將只使用這些位元組。例如,上面的結構可以重寫成:

struct{  unsigned int widthValidated : 1;  unsigned int heightValidated : 1;} status;

現在,上面的結構中,status 變數將佔用 4 個位元組的記憶體空間,但只有 2 位元被用來儲存值。如果您用了32 個變量,每個變量寬度為1 位,那麼status 結構將使用4 個字節,但只要您再多用一個變量,如果使用了33 個變量,那麼它將分配內存的下一段來儲存第33 個變量,這個時候就開始使用8 個位元組。讓我們看看下面的實例來理解這個概念:

#include <stdio.h>#include <string.h>/* 定义简单的结构 */struct{  unsigned int widthValidated;  unsigned int heightValidated;} status1;/* 定义位域结构 */struct{  unsigned int widthValidated : 1;  unsigned int heightValidated : 1;} status2; int main( ){
   printf( "Memory size occupied by status1 : %d\n", sizeof(status1));
   printf( "Memory size occupied by status2 : %d\n", sizeof(status2));   return 0;}

當上面的程式碼被編譯和執行時,它會產生下列結果:

Memory size occupied by status1 : 8Memory size occupied by status2 : 4

位元域宣告

在結構內宣告位域的形式如下:

struct{
  type [member_name] : width ;};

下面是關於位域中變數元素的描述:

##元素描述type整數類型,決定如何解釋位元域的值。類型可以是整數、有符號整數、無符號整數。 member_name位元域的名稱。 width位元域中位元的數量。寬度必須小於或等於指定類型的位元寬度。
有預先定義寬度的變數稱為#​​##位元域

。位元域可以儲存多於1 位元的數,例如,需要一個變數來儲存從0 到7 的值,您可以定義一個寬度為3 位元的位元域,如下:

struct{  unsigned int age : 3;} Age;
上面的結構定義指示C 編譯器,age 變數將只使用3 位元來儲存這個值,如果您試圖使用超過3 位,則無法完成。讓我們來看下面的實例:

#include <stdio.h>#include <string.h>struct{  unsigned int age : 3;} Age;int main( ){   Age.age = 4;
   printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
   printf( "Age.age : %d\n", Age.age );   Age.age = 7;
   printf( "Age.age : %d\n", Age.age );   Age.age = 8;
   printf( "Age.age : %d\n", Age.age );   return 0;}

當上面的程式碼被編譯時,它會帶有警告,當上面的程式碼被執行時,它會產生下列結果:

Sizeof( Age ) : 4Age.age : 4Age.age : 7Age.age : 0