首页 > 解决方案 > 为什么我们做“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;
}

标签: c++algorithmc++14

解决方案


some_int_expression > INT_MAX并且some_int_expression < INT_MIN永远不会有用,因为那些总是错误的。没有 int 值可以大于INT_MAX,也没有 int 值可以小于INT_MIN

res > INT_MAX/10为真时,doingres * 10将导致操作溢出 的可表示范围int,因此,程序的行为将是未定义的。


推荐阅读