位段的定义采用结构体来实现,如上例中,可将位段定义为:
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)不可以定义位段数组的形式。
已有 22658 名学员学习以下课程通过考试
最需教育客户端 软件问题一手掌握
去 App Store 免费下载 iOS 客户端
点击加载更多评论>>