困惑:
在閱讀linux核心原始碼過程中經常遇到在結構體中定義位域的情形,以提高空間的利用率。筆者有幾個困惑:
1. 位域可以不用在結構體中嗎?
2. 位域是gcc擴充套件的嗎?
3. 位域如何儲存和賦值?
為了解決上述困惑,筆者簡單寫了**去驗證答案
上述**在cc編譯器和gcc編譯器下分別進行編譯#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
在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語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾 個不同的區域,並說明每個區域的...