C或C++允许在结构体中以位为单位设置成员所占的内存空间,以位为单位的结构体成员,简称为位域或位段(Bit field)。位域的优点是节省空间,还可以进行内存对齐。常用于定义网络通讯协议或者应用程序标志位信息。

  1. 一般数据类型使用整型或者无符号整型。
  2. 一个位域必须存储在同一个字节中,如一个字节所剩空间不够存放另一位域,从下一单元存该位域。
  3. 无名位域来作填充或调整位置,无法使用。
  4. 位域长度为0则下一个位域从下一个字节开始,而且定义长度为0的位段不能指明名字

定义格式:数据类型 变量名:位域大小

举个例子:

#include <stdio.h>

struct ApplicationFlags {
    unsigned int IS_RUNABLE:1;  // 取值范围1bit=[0,1]
    unsigned int :4;            // 无名位域
    unsigned int AGE:2;         // 取值范围2bit=[0,3]
};

void main() {
    struct ApplicationFlags flags;
    flags.IS_RUNABLE = 1;
    flags.AGE = 2;
    printf("sizeof(flags)=%d\n", sizeof(flags));
    printf("flags.IS_RUNABLE=%d\n", flags.IS_RUNABLE);
    printf("flags.AGE=%d\n", flags.AGE);
}

// 使用PellesC执行结果:
// sizeof(flags)=4
// flags.IS_RUNABLE=1
// flags.AGE=2