位域的定义与结构体的定义相似,其一般形式如下:
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域的大小 来确定的。 还是按照 一般的结构体 那样 类型内存 对齐 分配。