有时我们存储信息时并不需要用到一个完整的字节,而只需要几个二进制位。C语言提供了一种数据结构,称为位域(位段)用于这种情况。
定义:
struct name{
类型名 位域名:位域长度; // 位域长度不能大于8(即一个字节)
};
注意:
一个位域必须存储在同一个字节中,当有两个连续的位域,在一个字节中存放第一个位域后剩下的空间不足以存放第二个位域,则第二个位域将存放在一个新的字节中,前一个字节多余的未补0
struct bits{
int a:4; // 第一个字节
int b:5; // 第二个字节
};
我们也可以显式使得某个位域存放在一个新的字节中,即使用空域
struct bits{
int a:4; // 第一个字节
int :0; // 空域
int b:2; // 第二个字节
};
当一个位域无位域名时,它只是用来作为填充或调整位置,不能被使用(int :4 仅仅是用来占4位)
位域变量的说明
与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:
struct bits{
int a:8;
int b:2;
int c:6;
}data;
说明data为bits变量,共占2个字节。其中位域a占8位,位域b占2位,位域c占6位。
空域大小
空域所占大小和 a的类型及空域的类型二者皆相关。
1、a,空域皆为char时,二者共占据1字节;a 为unsigned,空域为unsigned; a 为char,空域为unsigned; a 为unsigned,空域为char;这三种情况,二者共占据4字节。
2、 位域的长度不能大于指定类型固有长度,比如说int的位域长度不能超过32,bool的位域长度不能超过8。
3、 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
struct k{
int a:1
int :2 /*该2位不能使用*/
int b:3
int c:2
};
C语言提供了位域数据结构,允许在存储信息时仅使用几个二进制位。位域必须存储在同一字节中,除非需要新的字节来存放。位域变量的声明类似于结构变量,可以用于填充或调整位置,但无名位域不可用。位域长度受类型限制,不能超过其固有长度。
2687





