C語言位段
假設C程序中包含了一些分組在一個名為狀態結構TRUE/FALSE的變量,如下所示:
struct { unsigned int widthValidated; unsigned int heightValidated; } status;
這種結構需要8個字節的存儲空間,但在實際我們將存儲0或1到每一個變量。 C語言編程提供了一個更好的辦法,利用在這樣的情況下的內存空間。如果使用的是結構中這樣的變量,那麼可以定義一個變量,它告訴C編譯器隻使用這些字節數的寬度。例如,上述的結構可以被重新寫為如下:
struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status;
現在,上麵的結構將需要4個字節的存儲空間用於狀態變量,但隻有2位將被用來存儲數值。如果使用32個變量,每一個都帶有1位的寬度,那麼也狀態結構將使用4個字節,但必須要33個變量,那麼它將分配內存插槽旁邊,它開始使用8個字節。讓我們看看下麵的例子來理解這個概念:
#include <stdio.h> #include <string.h> /* define simple structure */ struct { unsigned int widthValidated; unsigned int heightValidated; } status1; /* define a structure with bit fields */ struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status2; int main( ) { printf( "Memory size occupied by status1 : %d ", sizeof(status1)); printf( "Memory size occupied by status2 : %d ", sizeof(status2)); return 0; }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Memory size occupied by status1 : 8 Memory size occupied by status2 : 4
位段聲明
位字段的聲明類似於結構體的形式:
struct { type [member_name] : width ; };
以下位字段變量元素的描述:
元素 | 描述 |
---|---|
type | 整數類型決定了位字段的值。該類型可以是int,signed int,unsigned int類型。 |
member_name | 位字段的名稱 |
width | 位字段的比特數。寬度必須小於或等於指定的類型的比特寬度 |
具有預定義寬度所定義的變量被稱為位域。位字段可容納超過例如一個位,如果需要一個變量來存儲值從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 ", sizeof(Age) ); printf( "Age.age : %d ", Age.age ); Age.age = 7; printf( "Age.age : %d ", Age.age ); Age.age = 8; printf( "Age.age : %d ", Age.age ); return 0; }
當上述代碼被編譯它會警告在編譯和執行時,它產生了以下結果:
Sizeof( Age ) : 4 Age.age : 4 Age.age : 7 Age.age : 0