簡體   English   中英

為什么將除法改為右移時會發生有符號溢出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM