假設我想乘以x
(3/8)
。所以,我可以用移位操作如下結果(結果要圓接近零):處理分數乘法溢出
int Test(int x) {
int value = (x << 1) + x;
value = value >> 3;
value = value + ((x >> 31) & 1);
return value;
}
所以我會在Test(11)
4
和-3
在Test(-9)
。問題是,因爲我第一次做乘法,我就必須在某個範圍內溢出,並在這些情況下,我不會得到正確的值:
Test(0x80000000) // returns -268435455, but it should be -268435456
我怎樣才能解決這個問題?
你已經在某天前發佈了這個問題。我(和其他人)告訴你,調用_undefined_和_implementation定義的behaviour_。而溢出也會調用未定義的行爲,所以所有投注都關閉。 – Olaf
您或者需要使用比int大的變量,例如假設'long'在你的系統上有更多的位。或者你可以把'int'分成兩個'int',每個都有一半的位數,然後進行數學運算。 – user3386109
@ user3386109:'long'在POSIX64上只有更多的位,並不是真正的便攜式。最好使用固定寬度類型。這些也具有明確的表示,因此有符號/無符號轉換行爲。 – Olaf