1. 位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。 所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。位域在本质上就是一种结构类型,不过其成员是按二进位分配的。
2. 位域定义:
struct 位域结构名
{
位域列表; //类型说明符 位域名:位域长度
}
如:
struct bs
{
int a:3;
int b:2:
int c:3;
};
3. 空域:宽度为 0 的一个未命名位域强制下一位域对齐到其下一type边界,其中type是该成员的类型。如:
struct bs
{
unsigned char a:1;
unsigned char :0; //空域
unsigned char b:2: //从下一个单位开始存放
unsigned char c:3;
};
3.1 位域的长度不能大于指定类型固有长度,比如说int的位域长度不能超过32;
3.2 位域可以是无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
4. 位域的对齐
4.1 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
4.2 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
4.3 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式(不同位域字段存放在不同的位域类型字节中),Dev-C++和GCC都采取压缩方式;
系统会先为结构体成员按照对齐方式分配空间和填塞(padding),然后对变量进行位域操作。