位域(位段):
有时我们存储信息时并不需要用到一个完整的字节,而只需要几个二进制位。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位)
位域结构的长度:
// 以下测试在Dev-cpp环境下完成的
// len = sizeof(bits) struct bits{ }; // len = 1 struct bits{ char ch; }; // len = 1 struct bits{ char a:2; }; // len = 1 struct bits{ char a:2; char b:2; }; // len = 1 struct bits{ char a:2; char b:2; char c:4; }; // len = 1 struct bits{ char a:2; char b:2; char c:4; char d:4; }; struct bits{ int n; }; // len = 4 struct bits{ int a:4; }; // len = 4 struct bits{ int a:4; int b:4; }; // len = 4 struct bits{ char a:8; int i:4; }; // len = 4 struct bits{ char a:8; char b:8; int i:4; }; // len = 4 struct bits{ char a:8; char b:8; char c:8; char d:8; int i:4; }; // len = 8
结论:
1.位域(位段)结构的大小既取决于结构内部所有位域的总大小,也取决于该位域声明时的类型
2.当一个位域结构内部所有位域总大小小于该结构中位域声明时的类型中长度最大的类型长度
时,该结构大小为该类型长度 (此处用用大小和长度区分自定义结构和C语言内置类型)
3.位域结构的大小总为该结构中存在的所有的位域在声明时所用的内置类型中长度最大的内置
类型的长度的整数倍(如上述示例中的最后一个 len = 8)