C語言 中結構體的位域(位段)

2021-06-23 08:03:13 字數 1265 閱讀 6941

有些資訊在儲存時,並不需要占用乙個完整的位元組, 而只需佔幾個或乙個二進位制位。

例如在存放乙個開關量時,只有0和1 兩種狀態, 用一位二進位即可。

為了節省儲存空間並使處理簡便,c語言又提供了一種資料結構,稱為「位域」或「位段」。所謂「位域」是把乙個位元組中的二進位劃分為幾個不同的區域並說明每個區域的位數。每個域有乙個網域名稱,允許在程式中按網域名稱進行操作。 這樣就可以把幾個不同的物件用乙個位元組的二進位制位域來表示。

1.位域的宣告

位域變數的宣告與結構變數宣告的方式相同。 如:

struct sampledata;

其中,data為sample變數,共佔兩個位元組。其中位域a佔第乙個位元組的7位,位域b佔第二個位元組的低2位,位域c佔第二個位元組的高6位。

2.位域的對齊

如果結構體中含有位域(bit-field),那麼vc中準則是:

1) 如果相鄰位域字段的型別相同且其位寬之和小於宣告資料型別的sizeof大小,則後面的字段將緊鄰前乙個字段儲存,直到不能容納為止;

2) 如果相鄰位域字段的型別相同但其位寬之和大於型別的sizeof大小(如:char 的位域長度不能超過8,int的位元組長度不能超過32),則後面的字段將從新的儲存單元開始,其偏移量為其型別大小的整數倍;

3) 如果相鄰的位域字段的型別不同,則各編譯器的具體實現有差異,vc6採取不壓縮方式(不同位域字段存放在不同的位域型別位元組中),dev-c++和gcc都採取壓縮方式;

系統會先為結構體成員按照對齊方式分配空間和填塞(padding),然後對變數進行位域操作。

位域可以有無位網域名稱,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:

struct sampledata;

#include #include #include struct a;

int main()

;

struct a d;

memcpy(&d, testarry, sizeof(d));

printf("%d ", sizeof(d));

printf("%d ", d.a);

printf("%d ", d.b);

printf("%d ", d.c);

system("pause");

return 0; }

編譯執行輸出結果:8 48 20 1

00110111 00110110 00110101 00110100 00110011 00110010 00110001 00110000

C語言中結構體的位域

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位...

C結構體之位域 位段

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位...

C結構體之位域(位段)

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位...