位置:首頁 > 軟件操作教程 > 編程開發(fā) > C語言 > 問題詳情

C語言 位段的定義

提問人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-02

位段的定義采用結(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ù)組的形式。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部