Java 为什么反向操作允许溢出处理?

Java 为什么反向操作允许溢出处理?,java,Java,leetcode问题()要求反转一个整数,这很简单,但如果出现溢出,则希望用户返回0。使用long也很简单,因为您可以检查它是否大于java中的INTEGER.MAX_INT或MIN_INT。但如果只允许32位整数,如何实现这一点 显示了以下解决方案: public int reverse(int x) { int result = 0; while (x != 0) { int tail = x % 10; int newResult

leetcode问题()要求反转一个整数,这很简单,但如果出现溢出,则希望用户返回0。使用long也很简单,因为您可以检查它是否大于java中的INTEGER.MAX_INT或MIN_INT。但如果只允许32位整数,如何实现这一点

显示了以下解决方案:

public int reverse(int x)
{
    int result = 0;

    while (x != 0)
    {
        int tail = x % 10;
        int newResult = result * 10 + tail;
        if ((newResult - tail) / 10 != result)
        { return 0; }
        result = newResult;
        x = x / 10;
    }

    return result;
}
我搞不懂为什么会这样。为什么“反转”操作并将其与上一个结果进行比较成功地检查溢出

如果你从x开始,然后说: x2=(x*10)+b,(x2-b)/10不总是等于x吗?因为正溢出总是循环到最小值,而负溢出总是循环到最大值。如何检查溢出?我希望对此有任何澄清

如果你从x开始,然后说:x2=(x*10)+b,(x2-b)/10不总是等于x吗

不。你关于“循环”的直觉对于加法和减法是正确的——就像12点左右在钟面上来回移动一样

但是,这不适用于乘法,如本例所示:

int x = 2_000_000_000;
int y = x * 10;
int z = y / 10;

System.out.println(x);   // 2000000000
System.out.println(z);   // -147483648

因此,要回答最重要的问题:

为什么“反转”操作并将其与之前的结果进行比较成功地检查溢出


因为当溢出发生时,“反转”这个操作序列不会让你回到输入值。

加法/减法是这样,乘法不是这样。你能解释一下为什么会这样吗?如果数字是这样环绕的,为什么在处理溢出时乘法不总是与除法相反?好的,实际上我认为这是有道理的。我看了一些小数字系统的例子,当你乘以一个数字再除以时,它是不相等的。如何将溢出的乘法或除法逆运算的概念扩展到任何乘法或除法运算?或者它仅在乘法/除法为10的情况下有效?我问这个问题是因为我看到这个问题有很长的解决方案,做一个操作反转听起来很容易,我不知道为什么每个人都不这么做。