以下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:

  

如果剩余足够的空间,那就是一个位字段   紧接着结构中的另一个位字段应该被打包   进入同一单元的相邻位。如果剩余空间不足,   是否将不适合的位域放入下一个单元或   重叠相邻单元是实现定义的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top