2014-11-17 68 views
-2

每當我試圖分割兩個整數時,當整數大於21474836時我得到了一些奇怪的結果 - 我認爲這是一些數據類型限制的情況,但是int埃格爾顯然要大得多:2147483647分區返回相反(負數)結果

正如我所說,只有當兩個整數大於21474836時纔會發生這種情況。

工作(因爲整數比21474836下):

(11474836 * 100)/11474836 // returns 100 

不工作:

(211474836 * 100)/211474836 // returns 0, should 100 
(31474830 * 100)/31474837 // returns -99, should 99~ 
(40000000 * 100)/41474837 // returns -7, should 96~ 

看到現場演示這裏http://ideone.com/lAeneM

問題是什麼?

+3

我看來,像功課的問題... –

+2

我不知道你在想什麼做乘法.. 。 –

+0

嘗試用'100ULL'代替'100'。 –

回答

1

你已經混淆了,2147483647是一個簽名長的上限。整數上限爲65535 - 詳見this post

改變值無符號長整型使您能夠解決您的問題所需要的範圍(0〜4294967295):

#include <iostream> 

using namespace std; 

int main() 
{ 
    cout << "Ret1: " << (21474837UL * 100UL)/21474837UL << endl; // should result 100 
    cout << "Ret2: " << (31474830UL * 100UL)/31474837UL << endl; // should result 99~ 
    cout << "Ret3: " << (40000000UL * 100UL)/41474837UL << endl; // should result 96~ 

    return 0; 
} 
+0

謝謝......我太累了,不能注意到這一點。我非常感謝這個詳細的答案:-) – Lucas

+0

考慮如果你想允許signed/negative值(在你的例子中不需要你的計算),你可以用'L'(long)改變'UL' ! – Robert

2

當您將這些值乘以100時,結果溢出並將最高位設置爲負值。

2

不要忘記,211474836 * 100大於INT_MAX,所以你越過了一個整數的邊界。將這些值解釋爲int64,你應該得到正確的結果。