结构声明中的冒号是什么意思,例如:1,:7,:16或:32?
-
05-07-2019 - |
题
以下C ++代码是什么意思?
unsigned char a : 1;
unsigned char b : 7;
我猜它会创建两个char a和b,并且它们都应该是一个字节长,但我不知道“1:”是什么。和“:7”。部分呢。
解决方案
1和7是位大小,用于限制值的范围。它们通常出现在结构和工会中。例如,在某些系统上(取决于 char
宽度和打包规则等),代码:
typedef struct {
unsigned char a : 1;
unsigned char b : 7;
} tOneAndSevenBits;
创建一个8位值, a
为1位, b
为7位。
通常在C中用于访问“压缩”数据。诸如4位nybble之类的值可能包含在8位字符的上半部分中:
typedef struct {
unsigned char leftFour : 4;
unsigned char rightFour : 4;
} tTwoNybbles;
对于我们中的语言律师来说,C ++ 11标准的9.6部分详细解释了这一点,略有解释:
位字段[class.bit]
表单
的成员声明者&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; 标识符<子>选择子>&NBSP;&NBSP;&NBSP;属性说明符<子>选择子> &NBSP;&NBSP; &NBSP;:&NBSP;&NBSP;&NBSP; 常数表达式
指定位字段;它的长度是通过冒号从位字段名称中设置的。可选的属性说明符附属于要声明的实体。 bit-field属性不是类成员类型的一部分。
常量表达式应为整数常量表达式,其值大于或等于零。整数常量表达式的值可以大于位字段的类型的对象表示中的位数;在这种情况下,额外的比特用作填充比特,不参与比特字段的值表示。
类对象中位域的分配是实现定义的。位字段的对齐是实现定义的。比特字段被打包到一些可寻址的分配单元中。
注意:位字段跨越某些机器上的分配单元而不是其他机器上的分配单元。在某些机器上从右到左分配位字段,在其他机器上从左到右分配。 - 结束记录
其他提示
我相信那些会是位域。
严格地说,位域必须是int,unsigned int或_Bool。虽然大多数编译器都采用任何整数类型。
参考C11 6.7.2.1:
位字段应具有合格或不合格的类型 _Bool的版本,signed int,unsigned int或其他 实现定义的类型。
您的编译器可能会分配1个字节的存储空间,但可以免费获取更多存储空间。
参考C11 6.7.2.1:
实现可以分配任何可寻址的存储单元 足以容纳一个位域。
当您有多个一个接一个地声明的位域时,就会节省成本。在这种情况下,如果可能,将分配已分配的存储。
参考C11 6.7.2.1:
如果剩余足够的空间,那就是一个位字段 紧接着结构中的另一个位字段应该被打包 进入同一单元的相邻位。如果剩余空间不足, 是否将不适合的位域放入下一个单元或 重叠相邻单元是实现定义的。