位字段溢出

Flo*_*ian 13 c overflow bit-fields

我可以相信每次访问位字段时C编译器都会模2 ^ n吗?或者是否有任何编译器/优化,如下所示的代码不会打印出溢出?

struct {
  uint8_t foo:2;
} G;

G.foo = 3;
G.foo++;

if(G.foo == 0) {
  printf("Overflow\n");
}
Run Code Online (Sandbox Code Playgroud)

先谢谢,弗洛里安

Ada*_*eld 12

是的,您可以信任C编译器在这里做正确的事情,只要使用无符号类型声明位字段即可uint8_t.根据C99标准§6.2.6.1/ 3:

存储在无符号位域中的值和unsigned char类型的对象应使用纯二进制表示法表示.40)

从§6.7.2.1/ 9开始:

位字段被解释为由指定位数组成的有符号或无符号整数类型.104)如果将值0或1存储到类型的非零宽度位字段中_Bool,则位字段的值应比较等于存储的值.

从§6.2.5/ 9(强调我的):

有符号整数类型的非负值范围是相应无符号整数类型的子范围,并且每种类型中相同值的表示相同.31) 涉及无符号操作数的计算永远不会溢出,因为无法用结果无符号整数类型表示的结果是以比结果类型可以表示的最大值大1的数量减少的模数.

所以是的,你可以确定任何符合标准的编译器都会G.foo溢出到0而没有任何其他不需要的副作用.