简介
有些信息存储时,并不需要占用一整个完整的字节,而只需要占几个或一个二进制位。例如存放一个开关变量时,只需要用到0或1两种状态,用一位二进制位即可。所以,为了节省空间,C语言提供了一种叫位域的数据结构。
定义
1 2 3 4
   | struct {     type [member_name] : width; };
   | 
 
| 元素 | 
描述 | 
| type | 
只能为int, unsigned int, signed int三种类型 | 
| member_name | 
位域的名称 | 
| width | 
位域中位的数量。宽度必须小于或等于指定类型的位宽度 | 
 
位域的使用:
- 位域成员的类型必须指定为unsigned或int类型。
 
- 一个位段必须存储在同一存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。
 
- 可以定义无名位域(形式:type :0;),无名位域用于填充内存布局,表示下一个位域从下一个内存边界开始。
 
- 位域的长度不能大于存储单元的长度,也不能定义位域数组。
 
- 位域可以用整型格式符输出。
 
- 位域可以在数值表达式中引用,它会被系统自动地转换成整型数。
 
- 位域定义的第一个位域长度不能为0。
 
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | typedef struct quicklistNode {     struct quicklistNode *prev;                  struct quicklistNode *next;                  unsigned char *zl;                           unsigned int sz;                             unsigned int count : 16;                     unsigned int encoding : 2;                   unsigned int container : 2;                  unsigned int recompress : 1;                 unsigned int attempted_compress : 1;         unsigned int extra : 10;                 } quicklistNode;                            
  int main() {     printf("quicklistNode size: %d\n", sizeof(struct quicklistNode));          
      return 0; }
  |