长长的分裂错了

时间:2014-09-20 10:16:48

标签: c++ long-integer division integer-overflow

我在一个项目中工作,在某个时间我遇到了这个问题。我有两个非常大的数字,我想分割它们并得到一个整数/长整数。这就是发生的事情:

代码

#include <iostream>
using namespace std;

int main(){
    long long n,m;
    cin >> n >> m;
    cout << n/m << endl;
}

输入可以是数字,直到100,000,000,000,000,000,因此该部门执行错误。

输出

#1 n: 76543210987654321 m: 7654321
#2 76543210987654321/7654321 = 1410312449

正确答案是10,000,000,130所以我想知道发生了什么......

2 个答案:

答案 0 :(得分:3)

正确的结果既不是1410312449也不是10000000130。它等于10000000129

至少这是GCC在www.ideone.com上展示的内容。你可以亲自试试。

#include <iostream>

int main() 
{
    long long n = 76543210987654321;
    long long m = 7654321;

    std::cout << n / m << std::endl;

    return 0;
}

似乎您将操作的结果放在int类型的对象中。请考虑以下代码

#include <iostream>

int main() 
{
    long long n = 76543210987654321;
    long long m = 7654321;
    int x;

    x = n / m;

    std::cout << n / m << std::endl;
    std::cout << x << std::endl;

    return 0;
}

输出

10000000129
1410065537

答案 1 :(得分:2)

看来,除法的结果被截断为32位值(int)。 尝试通过long long使用显式转换为static_cast。 另外,在编译器上知道sizeof(long long)的结果很有趣。