C語言結構體之位域
有些資訊在儲存時,並不需要佔用一個完整的位元組, 而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,C語言又提供了一種資料結構,稱為“位域”或“位段”。所謂“位域”是把一個位元組中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程式中按域名進行操作。 這樣就可以把幾個不同的物件用一個位元組的二進位制位域來表示。
例如:
struct p
{
int a:8;
int b:2;
int c:6;
}data;
在記憶體中即:
高位 0000 |0000 00|00|0000 0000| 低位
c b
這裡有幾點需要說明:
1.位域的大小不能超過所定義的資料型別,比如int是32位,若定義int a:33則編譯器會報錯error C2034:“p::a”:位域型別對位數太小
2.如果相鄰位域欄位的型別相同,且其位寬之和小於型別的sizeof大小,則後面的欄位將緊鄰前一個欄位儲存,直到不能容納為止;
3.如果相鄰位域欄位的型別相同,但其位寬之和大於型別的sizeof大小,則後面的欄位將從新的儲存單元開始,其偏移量為其型別大小的整數倍;
4.如果相鄰的位域欄位的型別不同,則各編譯器的具體實現有差異,VC6採取不壓縮方式(不同位域欄位存放在不同的位域型別位元組中),Dev-C++和GCC都採取壓縮方式;
下面舉一些例子來佐證:
struct p
{
char a:7;
char b:2;
char c:6;
}data;
高位 0000 |0000 00|00 0|000 0000| 低位 (a佔去了8bit中的7bit,剩下的1bit放不下b,所以b放入新的單元)
c b a
struct p{
short a:7;
short b:2;
short c:6;
}data;
此時情況則不同,因為short型有16位,abc都可以放下
高位 0000 |0000 00|00 |0000 0000| 低位
c b a
在VC中,即使b可以放在a的後面,但它們的資料型別不一樣,故b需要放入新單元struct p{ short a:7; char b:2; char c:6; }data;
高位0000 00|00| 0000 0000 0|000 0000| 低位
c b a