首先看一個例子:
struct a
{
int x:1;
int y:2;
int z:33;
};
位域的概念
位域是指信息在存儲時,並不需要佔用一個完整的字節, 而只需佔幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。爲了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱爲“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分爲幾 個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。
位域定義的幾點說明
1. 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。
2. 位域的長度不能大於指定類型固有長度,比如說int的位域長度不能超過32,bool的位域長度不能超過8。例如,在第3行代碼int z:33中,定義整型變量z爲33位,也就是超過了4字節,這是不合法的,會造成越界,所以程序在編譯時就會報錯。
3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
{int a:1; int :2; /*該2位不能使用*/ int b:3; int c:2};
位域變量的說明
與結構變量說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:
struct bs
{int a:8;int b:2;int c:6;}data, *bsp;
說明data爲bs變量,共佔2個字節。其中位域a佔8位,位域b佔2位,位域c佔6位。位域也是可以使用指針的。
賦值不能超過該位域的允許範圍。