位置:首页 > 软件操作教程 > 编程开发 > C语言 > 问题详情

C语言 位段的定义

提问人:刘团圆发布时间:2020-12-02

位段的定义采用结构体来实现,如上例中,可将位段定义为:

struct bxt_pack

{

    unsigned int flagl:1; 

    unsigned int flag2:1; 

    unsigned int flag3:l; 

    unsigned int no:5;

};

说明:

(1)位段结构中成员的类型只能有int、unsighed int和signed int这三种。不允许出现float、double等类型,也不可以出现char。

(2)成员名后面有一个冒号和一个整数,这个整数指定该位段所占的位长(单位为bit)。上述定义中,成员flagl、flag2、flag3各占1位,成员no占5位,共8位,1个字节。内存 分配形式如图所示。

    当然,也可以让这些成员所占内存空间之和超过1字节,例如:

struct data

{

    unsigned int a:l; 

    unsigned int b:3; 

    unsigned int c:4; 

    unsigned int d:6;

};

成员a、b、c、d总共占14bit。

(3)不同的编译器对位段成员的字长要求不一样,大部分编译器将位段成员的字长限制在一个int的长度范围之内。

(4)位段成员在内存中的实现是从左到右还是从右到左,不同的编译器是不一样的。但用户不需要考虑这些问题。

(5)—个位域必须存放在一个字节中,不能跨越两个字节,当第一个字节存放不下另一个位域时,可从下一个单元开始存放,也可以由程序员设定将某位域从下一个单元开始。如果某一位段要求从另一个字节开始存放,可以定义成如下形式:

    struct bit__pack 

    {

        unsigned int flagl:1;

        unsigned int flag2:1;

        unsigned :0; 

        unsigned int flag3:l; 

        unsigned int no:5;

    };

    定义中出现的长度为0的位段,作用是使下一个位段从一个新的单元开始存放。这样一来,flagl、flag2存放在一个单元中,而flag3、no存放在一个单元中。注意这个单元可以指1个字节,也可以是2个字节或4个字节,视不同的编译器而定。

(6)上面提到,位域不可以跨越两个字节,也就是说一个位域的最大长度为8bit。

(7)不可以定义位段数组的形式。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部