為了節省存儲空間,並使問題處理簡便,C語言提供了一種稱為“位域”或“位段”的數據結構。“位域”是把一個字節中的二進位劃分為多個不同的域,每個域的位數可以分別說明,每個域有一個域名,在程序中對域按域名操作。這樣就把不同的對象用一個字節的二進製位域來分別表示。例如,有些信息在存儲時,並不需要占用整個字節,隻需占一個或幾個二進製位就夠了,這種信息我們可以采用位域方式來存儲。再例如,存放一個狀態量時隻有0和1兩種狀態,用一位二進位即可表示。
1.位域的定義和位域變量的說明
位域定義與結構體定義相似,其形式為:
struct位域結構名
{位域列表;
};
其中位域列表形式為:類型說明符位域名:位域長度。
例如:
structs1
{
inta:3;
intb:5;
intc:2;
intd:6;
};
2.位域變量的說明
位域變量的說明有三種方式:
(1)先定義後說明;
(2)定義同時說明;
(3)直接說明。
例如:
structs2
{
inta:2;
intb:6;
intc:3;
}data;
說明data為s2位域結構變量,占兩個字節。其中位域a占2位,位域b占6位,位域c占3位。
對於位域的定義的幾點說明:
(1)一個位域不能跨兩個字節。
如一個字節所剩空間不足以存放另一位域時,應從下一新存儲單元作為起始存放該位域。也可以強製使某位域從下一新單元開始存放。例如:
structs3
{
unsigneda:4;
unsigned:0;
unsignedb:4;
unsignedc:4;
}
其中,a占第一字節的低4位,unsigned:0表示空域,即高4位填0,表示不使用。b從第二字節開始,占用低4位,c占用高4位。
(2)位域的長度小於8位。
由於位域不允許跨兩個字節,即不能超過8個二進製位。
(3)位域可以無位域名。
這種位域通常隻作填充或調整位置。無名位域是無法使用的。例如:
structs4
{
inta:1;
int:2;
intb:1;
intc:4;
};
其中,int:2;表示這兩位無位域名,不能使用。
由此看出,位域其本質就是一種成員按二進製位分配的結構體類型。
3.位域的使用
一般形式:
位域變量名.位域名
C語言源代碼:
#include
voidmain()
{
structs5
{
unsignedx:1;
unsignedy:4;
unsignedz:3;
}bit,*pbit;/*定義了位域結構s5,三個位域為x、y、z,指向s5類型的指針變量pbit*/