關於C語言位域的幾個困惑

2021-07-05 03:35:25 字數 856 閱讀 3587

困惑:

在閱讀linux核心原始碼過程中經常遇到在結構體中定義位域的情形,以提高空間的利用率。筆者有幾個困惑:

1. 位域可以不用在結構體中嗎?

2. 位域是gcc擴充套件的嗎?

3. 位域如何儲存和賦值?

為了解決上述困惑,筆者簡單寫了**去驗證答案

#include

#include

typedef

struct st1st1;

typedef

struct st2st2;

typedef

struct st3st3;

int main()

上述**在cc編譯器和gcc編譯器下分別進行編譯

#cc=cc#2. 位域是gcc擴充套件的嗎?

cc=gcc

flag=-wall -g -o2

colon: colon.c

$(cc) $(flag) colon.c -o colon

clean:

rm -fv *.o colon

編譯顯示,**在cc和gcc編譯器下均能編譯通過。

在gcc下,執行結果為

4 5

5 00

0e 1e

在gcc下,執行結果為

4 5

5 00

0e 1e

同時,當main函式的注釋釋放時,兩編譯器均無法正常編譯通過。

從上述的**執行結果看,可以對筆者的困惑作解答:

1. 位域似乎是只能用於struct中。

2. 位域應該是標準中的定義,和編譯器無關。

3.

C語言位域

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

C語言位域

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

C語言 位域

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