C語言 位段的定義
位段的定義采用結(jié)構(gòu)體來實(shí)現(xiàn),如上例中,可將位段定義為:
struct bxt_pack
{
unsigned int flagl:1;
unsigned int flag2:1;
unsigned int flag3:l;
unsigned int no:5;
};
說明:
(1)位段結(jié)構(gòu)中成員的類型只能有int、unsighed int和signed int這三種。不允許出現(xiàn)float、double等類型,也不可以出現(xiàn)char。
(2)成員名后面有一個(gè)冒號(hào)和一個(gè)整數(shù),這個(gè)整數(shù)指定該位段所占的位長(單位為bit)。上述定義中,成員flagl、flag2、flag3各占1位,成員no占5位,共8位,1個(gè)字節(jié)。內(nèi)存 分配形式如圖所示。
當(dāng)然,也可以讓這些成員所占內(nèi)存空間之和超過1字節(jié),例如:
struct data
{
unsigned int a:l;
unsigned int b:3;
unsigned int c:4;
unsigned int d:6;
};
成員a、b、c、d總共占14bit。
(3)不同的編譯器對位段成員的字長要求不一樣,大部分編譯器將位段成員的字長限制在一個(gè)int的長度范圍之內(nèi)。
(4)位段成員在內(nèi)存中的實(shí)現(xiàn)是從左到右還是從右到左,不同的編譯器是不一樣的。但用戶不需要考慮這些問題。
(5)—個(gè)位域必須存放在一個(gè)字節(jié)中,不能跨越兩個(gè)字節(jié),當(dāng)?shù)谝粋€(gè)字節(jié)存放不下另一個(gè)位域時(shí),可從下一個(gè)單元開始存放,也可以由程序員設(shè)定將某位域從下一個(gè)單元開始。如果某一位段要求從另一個(gè)字節(jié)開始存放,可以定義成如下形式:
struct bit__pack
{
unsigned int flagl:1;
unsigned int flag2:1;
unsigned :0;
unsigned int flag3:l;
unsigned int no:5;
};
定義中出現(xiàn)的長度為0的位段,作用是使下一個(gè)位段從一個(gè)新的單元開始存放。這樣一來,flagl、flag2存放在一個(gè)單元中,而flag3、no存放在一個(gè)單元中。注意這個(gè)單元可以指1個(gè)字節(jié),也可以是2個(gè)字節(jié)或4個(gè)字節(jié),視不同的編譯器而定。
(6)上面提到,位域不可以跨越兩個(gè)字節(jié),也就是說一個(gè)位域的最大長度為8bit。
(7)不可以定義位段數(shù)組的形式。
點(diǎn)擊加載更多評論>>