结构声明中的冒号是什么意思,例如:1,:7,:16或:32?

der*_*dji 42 c c++ bit-fields

以下C++代码是什么意思?

unsigned char a : 1; 
unsigned char b : 7;
Run Code Online (Sandbox Code Playgroud)

我猜它会创建两个char a和b,并且它们都应该是一个字节长,但我不知道":1"和":7"部分是做什么的.

pax*_*blo 58

1和7是位大小以限制值的范围.它们通常出现在结构和工会中.例如,在某些系统上(取决于char宽度和包装规则等),代码:

typedef struct {
    unsigned char a : 1;
    unsigned char b : 7;
} tOneAndSevenBits;
Run Code Online (Sandbox Code Playgroud)

创建一个8位值,一位为a7位,为7位b.

通常在C中用于访问"压缩"值,例如可能包含在8位字符的上半部分中的4位nybble:

typedef struct {
    unsigned char leftFour  : 4;
    unsigned char rightFour : 4;
} tTwoNybbles;
Run Code Online (Sandbox Code Playgroud)

对于我们这里的语言律师来说,C++ 11标准的9.6部分详细解释了这一点,略有解释:


位域[class.bit]

表单的成员声明者

     identifier opt    attribute-specifier opt    :    constant-expression

指定一个位域; 它的长度是通过冒号从位字段名称中设置的.可选的属性说明符附属于正在声明的实体.bit-field属性不是类成员类型的一部分.

常量表达式应整数表达式中具有大于或等于零的值.整数常量表达式的值可以大于位字段类型的对象表示中的位数; 在这种情况下,额外比特用作填充比特,并且不参与比特字段的值表示.

类对象中位域的分配是实现定义的.位字段的对齐是实现定义的.比特字段被打包到一些可寻址的分配单元中.

注意:位字段跨越某些机器上的分配单元而不是其他机器上的分配单元.在某些机器上从右到左分配位字段,在其他机器上从左到右分配.- 结束说明

  • @AndreyT,"实现定义类型"位在这里并不是多余的.如果不是这样,由于违反约束,编译器将需要提供诊断."实现定义类型"事件授予编译器接受其他类型而不提供诊断. (4认同)

Aze*_*utt 9

我相信那些会是位域.

  • 不确定,除非它是简洁或不确定,但这是一个upvote,因为(1)你在技术上是正确的; (2)分享爱情:-) (11认同)