2.12.6 位域
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用1位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”。
所谓“位域”,就是是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数,每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。位域的定义和位域变量的定义形式为:
- struct 位域结构名
- {
- 类型说明符位域名1: 位域长度;
- 类型说明符位域名2: 位域长度;
- ……
- 类型说明符位域名n: 位域长度;
- };
为了节省内存空间,可以把几个数据压缩到少数的几个类型空间中,比如需要表示两个3 位的二进制数和一个2 位的二进制数,则可以用一个8 位的字符表示。如下所示定义一个8位的位域:
- struct
- {
- char a : 3;
- char b : 3;
- char c : 2;
- };
可以看到,这个结构体所占空间为一个字节(8位),节省了内存空间。
位域的说明与结构变量说明的方式相同,可采用先定义后说明、同时定义说明或者直接说明这3 种方式。使用位域时应注意以下几点:
一个位域必须存储在同一个字节中,不能跨两个字节。
位域的长度不能大于一个字节的长度,也就是说不能超过8 位。
可以定义无名位域,这时它只能用来做填充或调整位置,无名位域在程序中是不能使用的。