位域(bit fields)简介
位域(bit fields)簡介
1、簡介
? ? ?位域是指信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,并使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾個不同的區域, 并說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。
?
2、位域定義
? ? struct-declarator:?
? ? declarator?
? ? type-specifier declarator opt: constant-expression
? ? 與結構定義相仿,其形式為:
struct 位域結構名
{?
位域列表?
};
其中位域列表的形式為: 類型說明符 位域名:位域長度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
?
3、位域的相關注意事項
對于位域的定義尚有以下幾點說明:
1.位域的長度不能大于指定類型固有長度,比如說int的位域長度不能超過32,bool的位域長度不能超過8。
2.位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1;
int :2;/*該2位不能使用*/
int b:3;
int c:2;
};
從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。
? ? ? ? 3、位域不能用sizeof運算符進行計算。
?
4、位域的對齊
如果結構體中含有位域(bit-field),那么VC中準則是:
1) 如果相鄰位域字段的類型相同,且其位寬之和小于類型的sizeof大小,則后面的字段將緊鄰前一個字段存儲,直到不能容納為止;
2) 如果相鄰位域字段的類型相同,但其位寬之和大于類型的sizeof大小,則后面的字段將從新的存儲單元開始,其偏移量為其類型大小的整數倍;
3) 如果相鄰的位域字段的類型不同,則各編譯器的具體實現有差異,VC6采取不壓縮方式(不同位域字段存放在不同的位域類型字節中),Dev-C++和GCC都采取壓縮方式;
系統會先為結構體成員按照對齊方式分配空間和填塞(padding),然后對變量進行位域操作。
?struct mybitfields
{
? ? unsigned short a : 4;
? ? unsigned short b : 5;
? ? unsigned short c : 7;
} test;
?
int main( void );
{
? ? test.a = 2;
? ? test.b = 31;
? ? test.c = 0;
}
?
the bits would be arranged as follows:
00000001 11110010
cccccccb bbbbaaaa
?
Since the 8086 family of processors stores the low byte of integer values before the high byte, the integer 0x01F2 above would be stored in physical memory as 0xF2 followed by 0x01.
總結
以上是生活随笔為你收集整理的位域(bit fields)简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: volatile的介绍
- 下一篇: Byte和bit的区别?