如何应对int溢出

时间:2014-01-06 16:44:50

标签: c++ casting int overflow long-integer

我有这个代码,我试图避免int类型的溢出。当我输入  {1000000,1000000}我得到0而不是1.这是由int类型的溢出引起的。我试图以某种方式施展它,但它不起作用,请帮助。

祝你好运!

#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

class SplitIntoPairs {
public:
    int makepairs(vector<int> A, int X)
    {

        int s = 0;
        sort(A.begin(), A.end());

        for (int i = 0; i < A.size() - 1; i += 2) {
            int k = A[i] * A[i + 1]; //bool b = true;
            if (A[i] * A[i + 1] > 2147483647) {
                k = (long long)(k);
                //  b=false;
            }
            if (k >= X)
                ++s;
        }
        //return the created int
        return s;
    }
};

2 个答案:

答案 0 :(得分:1)

A[i] * A[i + 1]正在执行整数运算,因此它会在A中溢出大值,在演员表无法正常工作之前与2147483647进行比较。

如果您在执行乘法之前将A中的值投射到很长时间,您甚至不需要进行比较。例如:

long long k = (long long)(A[i]) * (long long)(A[i + 1]);
if (k >= X)
    ++s;

答案 1 :(得分:1)

您选择了正确的方向 - 以64位整数存储产品,但您必须考虑将32位整数与32位整数相乘。您所需要的只是在乘法之前将32位整数转换为64位整数

int makepairs(std::vector<int> A, int X)
{
    int s = 0;
    sort(A.begin(), A.end());

    for (int i = 0; i < A.size() - 1; i += 2) {
        long long k = ((long long) A[i]) * A[i + 1];        
        if (k >= X)
            ++s;
    }
    //return the created int
    return s;
}