[英]Why might signed overflow occur when changing division to right-shift?
優化的時候,GCC有時會告訴我
假設將
/
或%
簡化為>>
或&
時不會發生有符號溢出
[-Wstrict-overflow
]
我未能為此制作可重現的測試用例,但我的生產代碼包含類似
int left = a.left() + (a.width() - b.width()) / 2;
其中所有方法都返回int
值。
為什么編譯器用>>1
替換/2
或(例如)用&3
替換%4
會導致整數溢出?
將新位移入符號位會導致意外結果發生:1001(有符號十進制:7)>> 1 結果為:0100(有符號十進制:4)。 至少在使用二進制補碼的實現中,這是大多數。
編輯:不過,在 x86 上,有保留符號位的移位指令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.