0%

结构体中的位域

简介

有些信息存储时,并不需要占用一整个完整的字节,而只需要占几个或一个二进制位。例如存放一个开关变量时,只需要用到0或1两种状态,用一位二进制位即可。所以,为了节省空间,C语言提供了一种叫位域的数据结构。

定义

1
2
3
4
struct
{
type [member_name] : width;
};
元素 描述
type 只能为int, unsigned int, signed int三种类型
member_name 位域的名称
width 位域中位的数量。宽度必须小于或等于指定类型的位宽度

位域的使用:

  1. 位域成员的类型必须指定为unsigned或int类型。
  2. 一个位段必须存储在同一存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。
  3. 可以定义无名位域(形式:type :0;),无名位域用于填充内存布局,表示下一个位域从下一个内存边界开始。
  4. 位域的长度不能大于存储单元的长度,也不能定义位域数组。
  5. 位域可以用整型格式符输出。
  6. 位域可以在数值表达式中引用,它会被系统自动地转换成整型数。
  7. 位域定义的第一个位域长度不能为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; // 64b
struct quicklistNode *next; // 64b
unsigned char *zl; // 64b
unsigned int sz; // 32b
unsigned int count : 16; // 16b
unsigned int encoding : 2; // 2b
unsigned int container : 2; // 2b
unsigned int recompress : 1; // 1b
unsigned int attempted_compress : 1; // 1b
unsigned int extra : 10; // 10b
} quicklistNode; // = (256b / 8) = 32Byte

int main()
{
printf("quicklistNode size: %d\n", sizeof(struct quicklistNode));
// output :
// quicklistNode size: 32

return 0;
}