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 ;};
下面是關於位域中變數元素的描述:
描述 | |
---|---|
整數類型,決定如何解釋位元域的值。類型可以是整數、有符號整數、無符號整數。 | |
位元域的名稱。 | |
位元域中位元的數量。寬度必須小於或等於指定類型的位元寬度。 |
。位元域可以儲存多於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