位結構體和位域

2021-10-07 02:54:57 字數 2044 閱讀 8192

1.位域的定義

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

位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:

位結構定義的一般形式為:

struct 位結構名 位結構變數;

其中: 資料型別必須是整型(包括字元型)。 整型常數的範圍是資料型別的長度, 如定義為short,則範圍是1~16,也就是說,當定義乙個short型別的成員位段時,它的整形常數取值範圍必須在0-16之間,超出範圍編譯器將報語法錯。具體範圍如下:

例如:

struct webpagech;

printf("%d\n", sizeof(struct webpage));

輸出結果:2。

2. 位域的對齊與計算

上面結構體大小為2,但是,為什麼會是2呢?先來了解下,結構體的對齊原則:

1). 若相鄰成員變數型別相同,且其位寬之和不大於成員變數型別位寬(在此嚴重強調,是型別位寬而不是成員變數sizeof,也不是型別的sizeof或者其他什麼)大小,則

後面的字段將緊鄰前乙個字段儲存,直到不能容納為止;

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

3). 如果相鄰的位域字段的型別不同,不同位域字段存放在不同的位域型別位元組中(這一條其實會根據編譯器的不同而採用不同的規則)。

例如:

struct a

;printf(「%d\n」, sizeof(struct a));

我們先分析下,如果遵循上面的對齊原則,結果應該會是多少。

c1, c2符合原則2,型別相同,那麼就是 c1佔1位,在0上;c2佔3位在1~3上,因為後面的unsigned short與c1, c2不是同型別,符合原則3,所以儲存在新的位元組上。即c1, c2在乙個位元組上; s2佔13位,在0-12上,也因和後面的i不是同型別,所以儲存在新位元組上,即s2佔兩個位元組。i佔3位,在0-2上,佔四個位元組。

即:1 + 2 + 4 = 7,但實際上,結構體還有個原則要遵守,即:和結構體一樣,位結構體也是按照成員的最大長度位元組來對齊分配空間的。如順序讀到的位域中最長的那個位元組數對齊,如為4位元組的long,則按4位元組對齊。若最長僅為char,則按char對齊。即依次按讀取到的資料型別進行對齊,並計算出最後的sizeof()!所以,這裡最大的成員型別是4個位元組,結構體的大小會是它的倍數,所以為距7最小4的倍數是8。得出,上面位結構體大小為:8,vc 6.0下輸出結果也為8。

但是,在code::blocks 10.5中,輸出結果卻為4。也就是說,它並沒有遵循上面的原則3。所以,原則3會和具體的編譯環境有關。

如果位域上的整形範圍值是0,則下個位域從新的位元組開始(即使是同型別的位域),如:

struct bs

;

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

struct k

;

注意:

1.乙個位域必須儲存在定義它的乙個資料型別內部,不能跨跨該資料型別。如char定義的位域所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。

2.由於位域不允許越過定義它的資料型別,因此位域的長度不能大於定義它的資料型別的長度。

3.位結構總長度(位數), 是各個位成員定義的位數之和再向最大結構成員對齊。

4. 位結構成員可以與其它結構成員一起使用。

例如:

struct infoworkers;

結構體和位域

c 陣列允許定義可儲存相同型別資料項的變數,結構是 c 程式設計中另一種使用者自定義的可用的資料型別,它允許您儲存不同型別的資料項。結構用於表示一條記錄,假設您想要跟蹤圖書館中書本的動態,您可能需要跟蹤每本書的下列屬性 為了定義結構,您必須使用struct語句。struct 語句定義了乙個包含多個成...

結構體之位域(位段)

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

結構體之位域(位段)

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