检测32位整数溢出

时间:2017-07-29 12:35:54

标签: c++ algorithm

我有一个基本上反转有符号整数的简单方法。此函数一直有效,直到整数小于或等于32位。 例如: -

input = 321
output = 123

input = -321
output = -123

input = 1534236469
output = 9646324351    //this value is wrong. 

expected output = 0

我想检测整数溢出并在这种情况下返回0。 以下是函数的代码

    int reverse(int x) {
    int number = x;
    bool negative = false;
    if(number<0){
        negative = true;
        number *= -1;
    }

    int reversed = 0;
    while (number != 0){
        int reminder = number % 10;
        reversed = (reversed * 10) + reminder;
        number /= 10;
    }
    if(negative){
        reversed *= -1;
    }
    return reversed;
}

此外,如果我将输入和输出更改为有符号长,我得到所需的输出,但我想检测整数溢出并返回0.

2 个答案:

答案 0 :(得分:3)

在将reversed乘以10之前,请检查以确保它足够小以乘以10。

同样,在添加remainder之前,请检查以确保其足够小以添加remainder

你可以使用一个聪明的技巧来增加,但在你的水平你可能不应该:

if ((reversed += remainder) < remainder) {
    //overflow
}

请注意,只有当reversedremainder都无符号时,此技巧才有效。

答案 1 :(得分:0)

此提示可能有助于您完成作业:

如果您的最终号码长度为10位且第一个数字最终高于或等于2,则您只会获得整数溢出。

这意味着如果您的原始数字也是10位数且最后一位数字是2或更高,那么您将获得整数溢出。