1
C/C ++程序设计
1.2.9.3 9.3 位域

9.3 位域

C语言可以在一个结构体中以二进制位为单位来指定其成员所占内存长度,这种以位为单位的成员就称为位域(bit field)。使用位域可以更高效的使用存储空间,这样就可以在一个字节中分别存放多个信息。

例如:

img345

以上结构体变量定义了n1、n2、n3、n4四个位域,分别占6个二进制位、4个二进制位、4个二进制位和2个二进制位。

在使用位域时,需要注意以下情况:

(1)一个位域必须存储在同一个存储单元中,不能跨两个单元。我们可以闲置没有使用的存储单元,当一个剩余存储单元放不下时,就从下一个单元开始存放。而且定义的每一个位域长度不能超过一个存储单元的容量。假如申请了一个位域是9位,超过了一个字节的容量,这就是错误的。

(2)位域名缺省时称作无名位域。

例如:

img346

第二次申请的2个空间的位域是闲置不使用的,因为没有位域名称。需要注意的是,同样是无名的位域,若它的存储空间是0,则有特殊的含义,它指的是这个字节剩余的空间不再使用,而从下个新字节开始存储。

例如:

img347

(3)一个结构体中既可以定义位域成员也可以同时定义一般的结构体成员。

例如:

img348

(4)不能定义以位域结构为元素的数组。

例如:

img349

(5)关于位域的引用与结构体相同。

例如:

img350

需要注意的是,a只占两位,也就是说a最大存储的二进制数是11,转换为十进制就是3,如果写成:data.a=10;这并不错,但是结果就不是我们期望的10了,变成了2,因为10的二进制码是1010,只截取右边两位10,故结果是2。

(6)位域也可以参与算术表达式的运算,这时系统自动将其转化为整型数。位域可以用整型格式符输出。

例如:

img351

a以有符号整数形式输出,b以无符号整数形式输出。