类可以将其数据成员定义成位域,在一个位域中有一定数量的二进制位。位域的声明形式是在成员名字后紧跟一个冒号以及一个常量表达式,该表达式用于指定成员所占的二进制位数。位域可以节省内存资源,使数据结构更紧凑。
位域有以下特点:
- 位域的类型必须是整型或者枚举类型,因为带符号位域的行为是由具体实现确定的,所以我们通常使用无符号类型保存一个位域。
- 取地址操作符&不能应用在位域字段上。
- 位域字段不能是类的静态成员。
- 位域字段在内存中的位置是按照从低位向高位的顺序放置的。
- 位域定义中的数据类型如果是有符号的,那么其位数就不能少于两位(因为其中一个是符号位)。
- 位域字段位数不能超过类型的最大位数。
//“Date::nWeekDay”: 位域类型对位数太小
struct Date
{
unsigned int nWeekDay : 33;
};
- 未命名的位域字段可以起到填充作用,位数为 0 时则起到强制对齐的效果。
struct Date
{
unsigned int nWeekDay : 3; // 0..7 (3 bits)
unsigned int nMonthDay : 6; // 0..31 (6 bits)
unsigned int : 0; // Force alignment to next boundary.
unsigned int nMonth : 5; // 0..12 (5 bits)
unsigned int nYear : 8; // 0..100 (8 bits)
};
int main()
{
Date date = {0};
date.nMonth = 10;
date.nYear |= 100;
system("pause");
return 0;
}