简介
有些信息存储时,并不需要占用一整个完整的字节,而只需要占几个或一个二进制位。例如存放一个开关变量时,只需要用到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; }
|