检测 32 位整数溢出

detecting 32 bit integer overflow

本文关键字:溢出 整数 检测      更新时间:2023-10-16

我有一个简单的方法,基本上可以反转有符号整数。此函数一直工作到整数小于或等于 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。

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

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

您可以使用一个聪明的技巧进行添加,但在您的级别上,您可能不应该:

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

请注意,仅当reversedremainder都未签名时,该技巧才有效。

此提示可能会帮助您完成作业:

只有当您的最终数字长度为 10 位并且第一个数字最终大于或等于 2 时,您才会得到整数溢出。

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