How can I detect integer overflow on 32 bits int?

前端 未结 5 1276
逝去的感伤
逝去的感伤 2020-12-03 06:33

I know such topic was asked several times, but my question is about overflow on full 32 bits of int. For example:

  11111111111111111111111         


        
相关标签:
5条回答
  • 2020-12-03 07:03

    The most intuitive method I can think of: calculate the sum (or difference) as a long, then convert that sum to an int and see if its value has changed.

    long longSum = (long) a + b;
    int sum = (int) longSum;
    if (sum == longSum) {
        // sum contains the correct result
    } else {
        // overflow/underflow
    }
    

    Remember that on modern 64 bit processors, working with longs is no less efficient than working with ints (the opposite may be true). So if you have a choice between checking for overflows or using longs, go for the latter.

    0 讨论(0)
  • 2020-12-03 07:15

    Overflow can be detected by a logical expression of the most significant bit of the two operands and the (truncated) result (I took the logical expression from the MC68030 manual):

    /**
     * Add two int's with overflow detection (r = s + d)
     */
    public static int add(int s, int d) throws ArithmeticException {
        int r = s + d;
        if (((s & d & ~r) | (~s & ~d & r)) < 0)
            throw new ArithmeticException("int overflow add(" + s + ", " + d + ")");
        return r;
    }
    
    0 讨论(0)
  • 2020-12-03 07:16
    long test = (long)x+y;
    if (test > Integer.MAX_VALUE || test < Integer.MIN_VALUE)
       // Overflow!
    
    0 讨论(0)
  • 2020-12-03 07:20

    Try this way:

    boolean isOverflow(int left, int right) {
        return right > 0
                ? Integer.MAX_VALUE - right < left
                : Integer.MIN_VALUE - right > left;
    }
    

    From: https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow

    0 讨论(0)
  • 2020-12-03 07:25

    Math.addExact throws exception on overflow

    Since Java 8 there is a set of methods in the Math class:

    • toIntExact(long)
    • addExact(int,int)
    • subtractExact(int,int)
    • multiplyExact(int,int)

    …and versions for long as well.

    Each of these methods throws ArithmeticException if overflow happens. Otherwise they return the proper result if it fits within the range.

    Example of addition:

    int x = 2_000_000_000;
    int y = 1_000_000_000;
    try {
        int result = Math.addExact(x, y);
        System.out.println("The proper result is " + result);
    } catch(ArithmeticException e) {
        System.out.println("Sorry, " + e);
    }
    

    See this code run live at IdeOne.com.

    Sorry, java.lang.ArithmeticException: integer overflow

    0 讨论(0)
提交回复
热议问题