您的位置:首页 > 其它

bit fields 总结

2014-06-27 11:19 49 查看
位域的定义与结构体的定义相似,其一般形式如下:

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域的大小 来确定的。 还是按照 一般的结构体 那样 类型内存 对齐 分配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: