c++ - 为什么我们做“INT_MAX/10”而不仅仅是INT_MAX?
问题描述
我正在解决一个简单的问题来反转 32 位有符号整数,但我无法理解其中的一部分。为了处理溢出,我尝试应用if(res > INT_MAX || res< INT_MIN)
,if(res*10 > INT_MAX || res*10< INT_MIN)
但没有一个起作用。只if(res > INT_MAX/10 || res< INT_MIN/10)
工作。我无法理解原因。
int reverse(int x) {
int rem,res=0;
while(x!=0)
{
rem=x%10;
x=x/10;
if((res > INT_MAX/10) || (res < INT_MIN/10)){
return 0;
}
res=(res*10)+rem;
}
return res;
}
解决方案
some_int_expression > INT_MAX
并且some_int_expression < INT_MIN
永远不会有用,因为那些总是错误的。没有 int 值可以大于INT_MAX
,也没有 int 值可以小于INT_MIN
。
当res > INT_MAX/10
为真时,doingres * 10
将导致操作溢出 的可表示范围int
,因此,程序的行为将是未定义的。
推荐阅读
- xml - XSL muenchian-多层次分组和嵌套
- regex - PowerShell 3 正则表达式 - 为什么不区分大小写不起作用?
- php - 无法使用 composer 在 laravel 中安装 PHP-FFMpeg/PHP-FFMpeg 库
- javascript - Typescript:如何管理具有冲突类型声明的依赖项?
- tensorflow - Keras NN 产生的结果具有良好的可变性预测但幅度预测较差
- php - 如何对总值求和
- sql - SQL 函数从列中解析出文本
- c# - 删除一个查询参数值
- racket - 球拍:如何防止图像离开屏幕而出现在另一侧?
- java - libGDX 出错,窗口立即打开和关闭