位域(bit-field) 是一种特殊的结构体成员,在结构体定义时,我们可以指定某个成员变量所占用的二进制位数(Bit)。
什么是位域?
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为 “位域” 或 “位段”。
位域声明
位域的定义与结构体相仿:
struct 结构名 {
//位域列表
type member_name : width; //width位宽:位域中位的数量
...
};
:
后的数字用来限定成员变量占用的位数,带有与定义宽度的变量称为位域。看下面的例子:
struct bs {
unsigned m;
unsigned int n : 5;
unsigned char ch : 6;
};
成员m
没有限制,根据数据类型即可推算出它占用4个字节(Byte)的内存。成员 n
、ch
被位宽限制,不能再根据数据类型计算长度,它们分别占用 5、6 位(Bit)的内存。
n
、ch
的取值范围非常有限,数据稍微大些就会发生溢出:
int main(void) {
//赋值
struct bs {
unsigned m;
unsigned int n : 5;
unsigned char ch : 6;
} data = {
0xad, 0xe, '$'};
//第一次输出
printf(<