dfr*_*fri 7 c++ integer-overflow language-lawyer bit-fields
cppreference中位字段的引用提供了以下示例:
Run Code Online (Sandbox Code Playgroud)#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:
后缀++表达式的值是其操作数的值....
如果操作数是不能表示递增值的位字段,则位字段的结果值是实现定义的.
但是,如果这也适用于无符号位域的环绕,我不确定.
二者[expr.pos]/1并[expr.ass]/6商定一个(有符号或无符号的)比特字段,该字段整数溢出定义实现.
[expr.pos]/1[...]如果操作数是不能表示递增值的位字段,则位字段的结果值是实现定义的.
[expr.ass]/6当赋值运算符的左操作数是不能表示表达式值的位字段时,位字段的结果值是实现定义的.
我已经修复了cppreference页面.感谢您的注意.