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位值,一位为a
7位,为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属性不是类成员类型的一部分.
的常量表达式应整数表达式中具有大于或等于零的值.整数常量表达式的值可以大于位字段类型的对象表示中的位数; 在这种情况下,额外比特用作填充比特,并且不参与比特字段的值表示.
类对象中位域的分配是实现定义的.位字段的对齐是实现定义的.比特字段被打包到一些可寻址的分配单元中.
注意:位字段跨越某些机器上的分配单元而不是其他机器上的分配单元.在某些机器上从右到左分配位字段,在其他机器上从左到右分配.- 结束说明