分部返回相反(负)的结果

时间:2014-11-17 10:10:15

标签: c++ c++11 division

每当我试图划分两个整数时,当整数大于21474836时,我得到一些奇怪的结果 - 我认为这是某些数据类型限制的情况,但是{{1}埃格尔显然要大得多:int

正如我所说,只有当两个整数大于2147483647时才会发生这种情况。

工作(因为整数低于21474836):

21474836

不工作:

(11474836 * 100) / 11474836 // returns 100

查看此处的实时演示http://ideone.com/lAeneM

有什么问题?

3 个答案:

答案 0 :(得分:2)

当你将这些值乘以100时,结果会溢出并设置最高位,使值变为负值。

答案 1 :(得分:2)

不要忘记211474836 * 100大于INT_MAX,所以你越过整数的边界。将值解释为int64,您应该得到正确的结果。

答案 2 :(得分: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;
}