位段以位為單位定義結構體(或共用體)中成員所佔儲存空間的長度。
含有位段的結構體型別稱為位段結構。
位段結構也是一種結構體型別,只不過其中含有以位為單位定義儲存長度的整數型別位段成員。採用位段結構既節省儲存空間,又可方便操作。
位段結構中位段的定義格式為:
unsigned 《成員名》:《二進位制位數》
例如:struct bytedata
data;
位段資料的引用:
同結構體成員中的資料引用一樣,但應注意位段的最大取值範圍不要超出二進位制位數定的範圍,否則超出部分會丟棄。
例如:data.a=2; 但 data.a=10;就超出範圍(a佔2位,最大3)
關於位段資料,注意以下幾點:
(1)乙個位段必須儲存在同一儲存單元(即字)之中,不能跨兩個單元。如果其單元空間不夠,則剩餘空間不用,從下乙個單元起存放該位段。
(2)可以通過定義長度為0的位段的方式使下一位段從下一儲存單元開始。
(3)可以定義無名位段。
(4)位段的長度不能大於儲存單元的長度。許多編譯器把位段成員的字長限制在乙個int的長度範圍之內;
(5)位段無位址,不能對位段進行取位址運算。
(6)位段可以以%d,%o,%x格式輸出。
(7)位段若出現在表示式中,將被系統自動轉換成整數
1、位段成員只有三種型別,int,unsigned int 和 signed int 這三種,位段使用unsigned int或者unsigned宣告,二者是等價的,這裡定義unsigned int的意思是開闢乙個整形資料空間,然後分配給位段a 2個二進位制位
2、位段成員的記憶體分配
例1、struct test1 :
該結構體定義了五個成員,第乙個成員f1,時unsigned
型別,緊跟在該成員之後的:1規定了它以1位存放,類似的,標誌f2和f3被定義為長
度只有1位,定義成員type占有4位,成員index占有9位。c編譯器自動的把上面的位段定義壓縮在一起。位段劃分如圖所示。
在深入的討論一下位段,如果使用下面的結構定義:
struct test2 ;
那麼,位段時怎麼樣被壓縮的呢?由於成員word的出現,故f1,f2不會壓縮在同乙個字內,c編譯器不會重新安排位段定義來試圖優化儲存空間。如圖:
可以指定無名位段,使得乙個字中的某些位被「跳過」,因此定義
strcut test3 ;
定義乙個結構體test3,它包含兩個位段變數type和cout,而無名位段規定了tyoe和cout間隔三位。如圖:
定義位數為0的無名位段.
struct test3 ;
定義乙個結構體test4,它包含兩個位段變數f1和f3,而無名位段規定了f1和f3間隔4個位元組。如圖:
有位段時的對齊規則是這樣:同型別的、相鄰的可連續在乙個型別的儲存空間中存放的位段成員作為乙個該型別的成員變數來對待,不是同型別的、相鄰的位段成員,分別當作乙個單獨得該型別的成員來對待,分配乙個完整的型別空間,其長度為該型別的長度,其他成員的分配規則不變,仍然按照前述的對齊規則進行。
C語言 中結構體的位域(位段)
有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域並說明每個區域的位數。...
c語言 位段
位段 位段的宣告和結構是類似的,有兩個不同 1 位段的成員必須是int unsigned int char 或 signed int。2 位段的成員後邊有乙個冒號和乙個數字。例子 include include struct a struct b struct c int main 經過 驗證 1 ...
C語言位段
有時,儲存1個資訊不必占用1個位元組,只需二進位制的1個 或多個 位就夠用。如果仍然使用結構型別,則造成記憶體空間的浪費。為此,c語言引入了位段型別。位段的概念與定義 所謂位段型別,是一種特殊的結構型別,其所有成員均以二進位制位為單位定義長度,並稱成員為位段。例如,cpu的狀態暫存器,按位段型別定義...