一、什么是位域?
因为在编程开发中,有时候不需要占用一根完整的字节,只需要使用几个bit或者一个bit,所以使用位域就是来节省内存空间的,并且能简单处理。
例如单片机开发中的开关只有通电和断电两种状态,用 0 和 1 表示就可以了,也就是用一个二进位。基于节省内存空间的考虑,C语言提供了一种叫做位域的数据结构。
二、位域定义
允许在一个结构体中以位为单位来指定其成员长度,这种以位为单位的结构体成员称为“位段”或者“位域”。位域只能是int、unsigned int、signed int类型。int默认是有符号整型(signed)。
struct 位域结构名
{
位域列表
}
例:
位域列表的形式:
类型说明符 位域名:位域长度
(定义一个位域abc,包含3个位域成员a、b和c)
struct abc
{
unsigned int a:22;//占22位
unsigned int b:11;//占11位
unsigned int c:22;//占6位
}data;
//data为bs变量,占用两个字节
//一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
三、例子
例1:
结果:
m、n、p共占一个int类型,4个字节,32位
例2:
输出结果:
m、n、p占三个int类型,12个字节,96位
因为m+n>32,故n占下一个字节。n+p>32,p占下一个字节
四、什么情况下使用位域?
位域的使用主要出现在如下两种情况:
(1)当机器可用内存空间较少而使用位域可以大量节省内存时。如,当把结构作为大数组的元素时。
(2)当需要把一结构或联合映射成某预定的组织结构时。例如,当需要访问字节内的特定位时。