bit fields 总结

来源:互联网 发布:以交易为生 知乎 编辑:程序博客网 时间:2024/06/05 04:55

位域的定义与结构体的定义相似,其一般形式如下:

struct 位域结构名

{

位域列表

};

其中位域列表的形式为:

 类型说明符 位域名:位域长度 

例如:

 struct data

{

unsigned int a:2;

   unsigned int b:3;

   unsigned int c:3;

};

其中a表示data的低两位,表示data的3~5为,c表示data的6~8位。


关于位域的定义,有一些问题需要注意:

第一,个位域必须存储在同一个字节中,不能跨两个字节。请读者看下面的例子:

struct data

{

unsigned int a:2;

   unsigned int b:4;

   unsigned int c:3;

};

在这个例子中,域名a、b占用6个位,域名c占3个位,这样1个完整的字节就没法存储a、b和c,c就得跨两个字节,这是不允许的。当一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。可以使用下面的方式,来解决这个问题。

struct data

{

unsigned int a:2;

   unsigned int b:4;

   unsigned int : 0  //  /*空域*/

   unsigned int c:3;

};

这样修改后,a占第一个字节的2位,b占接下来的4位,剩余的2位用0填充,表示不用。c会从第二个字节开始存储。

第二、位域的占用的位数,不能超过8个二进制位

前面已经提到了,位域不允许跨字节,当然位域的长度不能大于一个字节的长度。

第三、允许位域无域名

前文已经提到了,为了使某个域名从新的一个字节开始,可以使用无名的域来填充,做一下调整。要注意的是,无名的位域是不能使用的。


从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。


总结:

bit fields初始化时注意: 其是对位进行操作的,赋值时应该当小于其最大值(如果大于,那它的值不会有规律的推出下个 bit 的值。如 .a =10, 则.b不能确定)

2:bit fields 结构体,内存分配给其的空间 不是 按 bit域的大小 来确定的。  还是按照 一般的结构体 那样 类型内存 对齐 分配。



0 0
原创粉丝点击