位域成員不能單獨被取sizeof值(編譯報錯),我們這裡要討論的是含有位域的結構體的sizeof,只是考慮到其特殊性而將其專門列了出來。
c99規定int、unsigned int和bool可以作為位域型別,但編譯器幾乎都對此作了擴充套件,允許其它型別型別的存在。使用位域的主要目的是壓縮儲存,其大致規則為:
1) 如果相鄰位域字段的型別相同,且其位寬之和小於型別的sizeof大小,則後面的字段將緊鄰前乙個字段儲存,直到不能容納為止;
2) 如果相鄰位域字段的型別相同,但其位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別大小的整數倍;
3) 如果相鄰的位域字段的型別不同,則各編譯器的具體實現有差異,vc6採取不壓縮方式,dev-c++採取壓縮方式;
4) 如果位域字段之間穿插著非位域字段,則不進行壓縮;
5) 整個結構體的總大小為最寬基本型別成員大小的整數倍。
和結構體一樣,位結構體也是按照成員的最大長度位元組來對齊分配空間的。
測試:struct test
;test t1;
int len=sizeof(t1); //len=12,前兩個位域共用乙個char空間,按第三個位域long擴充套件為4位元組空間,最後乙個位域占用乙個char空間,按最長位域空間擴充套件為4位元組。
struct test
;test t1;
int len=sizeof(t1); //len=6,第一位域占用乙個char空間,按第二個位域short擴充套件為2位元組空間,最後乙個位域占用乙個char空間,按最長位域空間擴充套件為2位元組。
如果位域上的整形範圍值是0,則下個位域從新的位元組開始,前一字段後面空出的所有位元組都不使用(即使是同型別的位域),如:
struct bs
;sizeof(unsigned) == 4
上面這個位域定義中,a佔第一位元組的4位,第乙個位元組的後4位以及後面的3個位元組都填0表示不使用,b從新的位元組開始,占用4位,c占用4位。上面位結構體大小為:8
struct test
;test t1;
int len=sizeof(t1); //len=8
struct test
;test t1;
int len=sizeof(t1); //len=1
x;
unsigned char c;
} v;
v.c = 100;
printf("%d", v.x.s3); }
結果:3
,從地位開始分配位空間
18.有關位域的面試題(為什麼輸出的是乙個奇怪的字元)
a.t = 'b';效果相當於 a.t= 'b' & 0xf;
'b' --> 01100010
'b' & 0xf -->>00000010
所以輸出ascii碼為2的特殊字元
C 中位域的說明
一 位域 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個...
C語言位域和位段
c結構體之位域 位段 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區...
C 中關於位域的概念
位域 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c c 語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位制位劃分為幾個不同的區域,並...