是否可以保证无符号位字段的溢出可以环​​绕?

时间:2019-01-15 17:35:16

标签: c++ language-lawyer integer-overflow bit-fields

详细信息

reference for bit fields at 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
}

强调保证的环绕式注释。

但是,WG21 CWG Issue 1816描述了一些不清楚的位字段值规范的问题,而[expr.post.incr]/1描述了最新的标准草案状态:

  

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

     

如果操作数是不能表示增量值的位域,则该位域的结果值由实现定义。

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

问题

  • 是否可以保证无符号位域的溢出?

1 个答案:

答案 0 :(得分:8)

[expr.pos]/1[expr.ass]/6都同意在(有符号或无符号)位字段上定义整数溢出。

  

[expr.pos]/1

     

[...]如果操作数是不能表示增量值的位域,则该位域的结果值是实现定义的。

     

[expr.ass]/6

     

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

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