1. 程式人生 > >C語言結構體之位域

C語言結構體之位域

有些資訊在儲存時,並不需要佔用一個完整的位元組, 而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,C語言又提供了一種資料結構,稱為“位域”或“位段”。所謂“位域”是把一個位元組中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程式中按域名進行操作。 這樣就可以把幾個不同的物件用一個位元組的二進位制位域來表示。

例如:

struct p
{
  int a:8;
  int b:2;
  int c:6;
}data; 
在記憶體中即:

高位 0000 |0000 00|00|0000 0000|  低位

c         b          

a

這裡有幾點需要說明:

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

struct p{
    short a:7;
    char b:2;
    char c:6;
}data;
在VC中,即使b可以放在a的後面,但它們的資料型別不一樣,故b需要放入新單元

高位0000 00|00| 0000 0000 0|000 0000|  低位

c      b                              a