关于位域

(1)编译器为 位段类型变量分配空间的时候,是按照定义位段类型变量时使用的类型为变量分配空间的。

如:

typedef struct

 {

          unsigned long minor_ver : 4;

}VALUE_B;

sizeof (VALUE_B) 的值是4,是按照unsigned long 类型来分配的空间,未使用的位闲置 (2)一个位段必须存储在同一

存储单元(即字:32位机上应该是32位)之中,不能跨两个单元。如果其单元空间不够,则剩余空间不用,从下一个单元起

存放该位段同一个字内的位段会被连续压缩。 如:

struct packed_struct

{

          unsigned int f1 :1;

          unsigned int f2 :1;

          unsigned int f3 :1;

          unsigned int type :4;

          unsigned int index :9;

};

被压缩之后的低16结构如下图,高16位没有使用 所以

typedef struct

{

          unsigned short sch_flag : 2;

          unsigned short cont_id : 5;

          unsigned short major_ver : 5;

          unsigned short minor_ver : 4;

}VALUE_B;

 sizeof (VALUE_B) 的值是2,所有的位段都被压缩到2个字节的空间中了

(3)如果把上面结构体里的short改成char后,

typedef struct

{

         unsigned char sch_flag : 2;

         unsigned char cont_id : 5;

         unsigned char major_ver : 5;

         unsigned char minor_ver : 4;

 }VALUE_B;

编译器会把sch_flag 和cont_id 压缩到一个字节里,为major_ver 分配空间时,发现只有3bit可用,所以会新分配一

个字节的空间来放major_ver ,同样也会新分配一个字节的空间来放minor_ver 所以sizeof (VALUE_B) 的值是3 其

他使用位段时应该注意的问题,大家可以参考一下: * 在某些机器上, 位段总是作为 unsigned 处理, 而不管它们是否

被说明成unsigned 的。 * 大多数C 编译器都不支持超过一个字长的位段。 * 位段不可标明维数; 即, 不能说明位段数

组, 例如 flag:l[2]。 * 最后, 不可以取位段地址。原因是, 在这种情况不, 显然没有称作为 "位段指针" 类型的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值