(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]。 * 最后, 不可以取位段地址。原因是, 在这种情况不, 显然没有称作为 "位段指针" 类型的变量。