以下的C++代码是什么意思?
unsigned char a : 1;
unsigned char b : 7;
我猜这段代码创建了两个字符a和b,它们都应该是一个字节长的,但我不知道": 1"和": 7"是什么意思。
以下的C++代码是什么意思?
unsigned char a : 1;
unsigned char b : 7;
我猜这段代码创建了两个字符a和b,它们都应该是一个字节长的,但我不知道": 1"和": 7"是什么意思。
数字1和7表示限制值的范围的位大小。它们通常出现在结构体和联合体中。例如,在某些系统上(取决于char
的宽度和打包规则等),以下代码:
typedef struct {
unsigned char a : 1;
unsigned char b : 7;
} tOneAndSevenBits;
创建一个8位值,其中1个比特用于表示a
,其余7个比特用于表示b
。
通常在C语言中用于访问“压缩”值,例如4位的nibble可能包含在8位字符的上半部分中:
typedef struct {
unsigned char leftFour : 4;
unsigned char rightFour : 4;
} tTwoNybbles;
对于我们中的语言律师,C++11标准的9.6节详细解释了这一点,稍有改述:
位域 [class.bit]
形式为
identifieropt attribute-specifieropt : constant-expression
的成员声明符指定一个位域;它的长度由冒号与位域名称分隔开。可选的attribute-specifier适用于正在声明的实体。位域属性不是类成员类型的一部分。
constant-expression必须是一个值大于或等于零的整数常量表达式。整数常量表达式的值可能大于位域类型的对象表示中的位数;在这种情况下,额外的位被用作填充位,不参与位域的值表示。
类对象内的位域分配是实现定义的。位域的对齐方式是实现定义的。位域被打包到某个可寻址的分配单元中。
注意:位域在某些机器上跨越分配单元,在其他机器上则不是。位域在某些机器上从右到左分配,在其他机器上则从左到右。- 注解
您的编译器可能会分配1个字节的存储空间,但它可以自由地获取更多空间。位域的类型应为_Bool、signed int、unsigned int或某种其他实现定义的类型的限定或未限定版本。
当您有多个位域在声明后面时,节省存储空间。在这种情况下,如果可能,分配的存储空间将被打包。一个实现可以分配任何可寻址的存储单元,以容纳位域。
如果有足够的空间,紧随结构体中另一个位域后面的位域将被打包到同一单元的相邻位中。如果剩余空间不足,则不适合的位域是放入下一个单元还是重叠相邻单元是实现定义的。