无符号位字段溢出是否保证环绕?

dfr*_*fri 7 c++ integer-overflow language-lawyer bit-fields

细节

cppreference中位字段引用提供了以下示例:

#include <iostream>
struct S {
 // three-bit unsigned field,
 // allowed values are 0...7
 unsigned int b : 3;
};
int main()
{
    S s = {7};
    ++s.b; // unsigned overflow (guaranteed wrap-around)
    std::cout << s.b << '\n'; // output: 0
}
Run Code Online (Sandbox Code Playgroud)

强调保证环绕评论.

但是,WG21 CWG Issue 1816描述了一些可能的问题,即位字段值的规范不清楚,以及最新标准草案规则中的[expr.post.incr]/1:

后缀++表达式的值是其操作数的值....

如果操作数是不能表示递增值的位字段,则位字段的结果值是实现定义的.

但是,如果这也适用于无符号位域的环绕,我不确定.

  • 无符号位字段溢出是否保证环绕?

YSC*_*YSC 8

二者[expr.pos]/1[expr.ass]/6商定一个(有符号或无符号的)比特字段,该字段整数溢出定义实现.

[expr.pos]/1

[...]如果操作数是不能表示递增值的位字段,则位字段的结果值是实现定义的.

[expr.ass]/6

当赋值运算符的左操作数是不能表示表达式值的位字段时,位字段的结果值是实现定义的.

我已经修复了cppreference页面.感谢您的注意.