C語言的位域

2021-06-07 23:58:32 字數 694 閱讀 3473

在c語言的結構體中,可以使用乙個位元組的某幾位來定義乙個成員,成為位域,如

struct a

;

表示該結構體有三個成員,成員a佔乙個位元組的4位,成員b佔5位,成員c佔7位。

關於位域在記憶體中的儲存,有如下幾個特性:

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

2) 如果相鄰位域字段的型別相同,但其位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別大小的整數倍。

3) 如果相鄰的位域字段的型別不同,則各編譯器的具體實現有差異,vc6採取不壓縮方式,dev-c++採取壓縮方式。

4) 如果位域字段之間穿插著非位域字段,則不進行壓縮。

5) 整個結構體的總大小為最寬基本型別成員大小的整數倍。

示例如下:

#include struct a

;struct b

;struct c

;struct d

;int main()

檢視有些資料說,位域合併時不能跨位元組,而且單個位域長度不能超過8位,但是在gcc 4.3下測試,這兩種情況都是可以的

說明:以上**都是在gcc 4.3下測試,其他編譯器沒有測試

C語言位域

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

C語言位域

1.乙個位域必須儲存在同乙個位元組中,不能跨兩個位元組。如乙個位元組所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如 struct bs 在這個位域定義中,a佔第一位元組的 2位,後6位填 0表示不使用,c 從第二位元組開始,占用1位 2.由於位域不允許跨...

C語言 位域

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