1

以下是我要实现的一段代码:

if (n1 > 0 && n2 > 0 && result >= Integer.MAX_VALUE) {
    result = Integer.MAX_VALUE;
}
else if (n1 > 0 && n2 > 0 && (result <= Integer.MIN_VALUE || result < 0)) {
    result = Integer.MAX_VALUE;
}
else if (n1 < 0 && n2 < 0 && (result <= Integer.MIN_VALUE || result == 0)) {
    result = Integer.MIN_VALUE;
}

但我没有得到令人满意的结果。例如,-2147483640-10 给我 2147483646。

我确信必须有一种更具体的方法来进行饱和。

4

2 回答 2

1

如果您需要为溢出设置限制Integer.MAX_VALUE并且Integer.MIN_VALUE在发生溢出的情况下,您应该跟踪结果的符号是否已更改以定义溢出发生的时间。

除非resultis long,否则无需检查条件result >= Integer.MAX_VALUE,例如正溢出或result <= Integer.MAX_VALUE负溢出。

public static int add(int n1, int n2) {
    System.out.printf("%d + %d = ", n1, n2);
    int result = n1 + n2;

    if (n1 > 0 && n2 > 0 && result < 0) {
        result = Integer.MAX_VALUE;
    } else if (n1 < 0 && n2 < 0 && result > 0) {
        result = Integer.MIN_VALUE;
    }

    return result;
}

测试:

System.out.println(add(10, 20));
System.out.println(add(2147483640, 10));

System.out.println(add(-10, -20));
System.out.println(add(-2147483640, -10));

输出:

10 + 20 = 30
2147483640 + 10 = 2147483647
-10 + -20 = -30
-2147483640 + -10 = -2147483648
于 2021-02-04T19:43:40.540 回答
0

它可以简单地完成:

return Math.min(Math.max((long) n1 + n2, Integer.MIN_VALUE), Integer.MAX_VALUE);

该操作(long) n1 + n2确保结果是 a long,因此n1 + n2既不会上溢也不会下溢

Math.max((long) n1 + n2, Integer.MIN_VALUE)确保在这种情况下会n1 + n2出现下溢,我们得到 value Integer.MIN_VALUE。否则,我们得到 的结果n1 + n2

最后,Math.min(.., Integer.MAX_VALUE)确保 ifn1 + n2溢出方法返回Integer.MAX_VALUE。否则,n1 + n2将返回操作。

运行示例:

public class UnderOver {

    public static long add(int n1, int n2){
       return Math.min(Math.max((long) n1 + n2, Integer.MIN_VALUE), Integer.MAX_VALUE);
    }

    public static void main(String[] args) {
        System.out.println(add(Integer.MAX_VALUE, 10));
        System.out.println(add(Integer.MIN_VALUE, -10));
        System.out.println(add(-10, -10));
        System.out.println(add(10, 10));
        System.out.println(add(10, 0));
        System.out.println(add(-20, 10));
    }
}

输出

2147483647
-2147483648
-20
20
10
-10
于 2021-02-04T20:10:49.227 回答