优化时,GCC有时会告诉我
假设在将
/
或%
简化为>>
或&
时不会发生签名溢出 [-Wstrict-overflow
]
我没有为此制作可重现的测试用例,但我的生产代码包含类似
的内容int left = a.left() + (a.width() - b.width()) / 2;
其中所有方法都返回int
个值。
为什么编译器用/2
替换>>1
或用%4
代替&3
导致整数溢出?
答案 0 :(得分:1)
将新位移入符号位会导致意外结果: 1001(带符号的十进制:7)>> 1结果是: 0100(带符号的十进制:4)。 至少使用两个补码的实现,这是大多数。
编辑:但是在x86上,有一些保留符号位的移位指令。