黑色C語言 位域

2021-09-22 18:45:18 字數 1323 閱讀 9593

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

位域定義格式與結構體類似,形式如下:

struct 位域結構名;注:

1.位域是可以先定義後說明,也能定義和說明同是操作,也能直接說明;

2.不一定要寫位網域名稱,不寫的這種是匿名的,我們不能使用它,

但是它的作用是拿來調整格式的(拿0補齊);

3.在c語言中, 規定的位域型別只能是ints,

應該是包括了signed和unsigned的char、short和int。

最好標註好是signed 還是unsigned型別;

eg:struct mybitfields test;

分析:例子中test為mybitfields變數,共佔兩個位元組,

其中a佔四位,匿名的佔四位(補0調整格式),b佔6位。

壓縮概念:如果相鄰位字段的位域型別相同,各個位域只佔定義時對的bit長度。

壓縮規則:

如果相鄰位域字段的位域型別相等的時候,且其位域寬之後小於該類的的位元組大小(sizeof()計算),則後面的字段會儲存在相鄰前的乙個欄位中儲存,直到不能容納;另語:相鄰的字段中的前乙個欄位的位元組的剩餘空間足夠儲存下乙個位域,則將下乙個位域的內容儲存在該位元組中;

如果相鄰位域字段的位域型別相等的時候,且其位域寬之後大於該類的的位元組大小(sizeof()計算),則後面的字段會儲存在乙個新的字段中,如果前乙個欄位有空餘的位,則拿0補齊;**另語:如果相鄰欄位中前乙個欄位的位元組剩餘的空間不足以儲存下乙個位域字段的位域的時候,則從下乙個位元組中儲存後面的位域,前乙個位域的剩餘空間以0補齊。

如果相鄰位域字段的位域型別不相等,則根據編譯器有不同的結果;

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

如果相鄰的位域字段的型別不同,在不同的位域型別間,按通用的對齊規則進行不同資料型別間的對齊;同時在相同位域型別的字段間按以上兩條規則對齊。整個位域結構的總大小為其中位域字段的最寬基本型別成員大小的整數倍,即小於它的大小的按最大的計算。

C語言位域

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

C語言位域

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

C語言 位域

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