2014-11-17 37 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,你应该得到正确的结果。