为什么在将分部改为右移时可能会发生签名溢出?

时间:2017-02-08 10:02:35

标签: c++ compiler-warnings integer-overflow gcc-warning

优化时,GCC有时会告诉我

  

假设在将/%简化为>>&时不会发生签名溢出   [-Wstrict-overflow]

我没有为此制作可重现的测试用例,但我的生产代码包含类似

的内容
int left = a.left() + (a.width() - b.width()) / 2;

其中所有方法都返回int个值。

为什么编译器用/2替换>>1或用%4代替&3导致整数溢出?

1 个答案:

答案 0 :(得分:1)

将新位移入符号位会导致意外结果: 1001(带符号的十进制:7)>> 1结果是: 0100(带符号的十进制:4)。 至少使用两个补码的实现,这是大多数。

编辑:但是在x86上,有一些保留符号位的移位指令。