检测 32 位整数溢出
detecting 32 bit integer overflow
我有一个简单的方法,基本上可以反转有符号整数。此函数一直工作到整数小于或等于 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
}
请注意,仅当reversed
和remainder
都未签名时,该技巧才有效。
此提示可能会帮助您完成作业:
只有当您的最终数字长度为 10 位并且第一个数字最终大于或等于 2 时,您才会得到整数溢出。
这意味着如果您的原始数字长度也是 10 位并且最后一个数字是 2 或更高,您将获得整数溢出。
相关文章:
- 整数溢出,最大值为 pow(10,19)
- 模函数,避免C++整数溢出
- 优化正在杀死我在 clang 6 中的整数溢出检查
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 我在c++中遇到了一个奇怪的错误,其中一个计算2个小整数加法的语句溢出到一个长值中
- 将字符串转换为整数类型T,检查是否存在溢出
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- 结构上溢出的整数加法
- 我很难理解这些关于检测整数溢出的评论
- 检测 32 位整数溢出
- 32 位整数缩放,无溢出
- 如何在没有整数溢出的情况下找到n%(k*k)
- C 中俄罗斯农民算法中的整数溢出
- 快速方法可以将整数乘以适当的分数,而无需浮点或溢出
- C 和 C++ 中的整数计算溢出
- 检查Android NDK COD中的整数溢出
- 是否有一些有意义的统计数据来证明保持有符号整数算术溢出未定义是合理的
- 对于特定情况的整数溢出似乎是由整数溢出引起的错误
- 如何修复整数溢出警告
- 我可以在C/ c++中指定是否封顶或溢出整数吗?