位段(bit-field)是以位为单位来定义结构体(或联合体)中的成员变量所占的空间。含有位段的结构体(联合体)称为位段结构。采用位段结构既能够节省空间,又方便于操作。
位段结构中位段的定义格式为:
类型 <成员名>:<二进制位数>
struct bytedata { unsigned a:2; /*位段a,占2位*/ unsigned:6; /*无名位段,占6位,但不能访问*/ unsigned:0; /*无名位段,占0位,表下一位段从下一字边界开始*/,有名位段必须给大小 unsigned b:10; /*位段b,占10位*/ int i; /*成员i,从下一字边界开始*/ }data;
有位段时的对齐规则是这样:
1、同类型的、相邻的可连续在一个类型的存储空间中存放的位段成员作为一个该类型的成员变量来对待
2、不是同类型的、相邻的位段成员,分别当作一个单独得该类型的成员来对待,分配一个完整的类型空间,其长度为该类型的长度,其他成员的分配规则不变,仍然按照前述的对齐规则进行。
例如:
struct node4 { unsigned int a:1; //与后面类型不一致,分配类型空间 +4字节 unsigned char b:1;//与前类型不一致,分配类型空间 +1字节 unsigned int c:1; //与前类型不一致,分配类型空间,从自然边界算起。从第8字节起,+4 unsigned int d:2; //与前类型一致,不超过类型位数 unsigned int e:2; //与前类型一致,不超过类型位数 }S4;
故S4大小为12字节(vc 6.0下测试)
typedef struct node4 { unsigned int a:1; unsigned char b:1; unsigned int c:1; unsigned int d:2; unsigned int e:2; }S4; int main() { S4 s4; s4.a=1; s4.b=1; s4.c=1; s4.d=1; s4.e=1; return 0; }
结果示意图如下:
从左至右看,
1 .前4字节代表a的空间,但实际只用到了1个位,最低位。0XCD = 0b1100,110 1<--a
2.第5字节代表b的空间,单实际也只用到了1个位,最低位。0xCD = 0b1100,110 1<--b
3. 第9-12字节代表剩余位段空间,但是实际只用了5位,最低5位。0xCB = 0b110,01(e),01(d),1(c)