C/C++拾遗之位字段(Bit Field)

位字段(bit field)也称位域,是一个由signed int 或 unsigned int中一组相邻的位 (C99 还允许 _Bool类型的位字段). 位字段由一个结构体声明建立, 该结构声明为每个字段提供标签, 并决定字段的宽度。使用位字段可以将有些仅需要很少的变量范围的值压缩到一个较小的结构体中。
声明时需要在变量名后面跟冒号(:),冒号后面跟上需要设置的它的位宽度。
或者在在类型名后面跟冒号再跟位宽度,用于对齐占位

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>

struct bit_conf {
unsigned int a:1; //声明一个位宽为1位的成员变量a,也就是a只能是1或0
int b:4; //声明一个位宽为4的成员变量b,其可表示范围为有符号的-2^2~2^2
unsigned int c:7;
unsigned int d:20; //一个int占4个字节,32位,那么一个字节之内bit_conf中共可以有32个位
//,所以此时sizeof(bit_conf)为4,如果将d声明为21,则sizeof(bit_conf)将为8,由于内存对齐的原因,就需要占用8个字节
};

int main(void)
{
bit_conf conf;
conf.b = -8; //其取值只能是-8~8
std::cout << conf.b << std::endl;
std::cout << "sizeof(bit_conf):" << sizeof(bit_conf) << std::endl;
return 0;
}

输出结果为:

1
2
-8
sizeof(bit_conf):4

注意位域具有不可移植性,也就是说各平台之间具体特异性,不同的平台实现可能不一样。