2014-01-20 4 views
0

Я знаю, что такая тема задавалась несколько раз, но мой вопрос о переполнении на полные 32 бита int. Например:Как я могу обнаружить целочисленное переполнение по 32 битам

11111111111111111111111111111111 + 
    00000000000000000000000000000001 = 
    00000000000000000000000000000000 //overflow! 

Я нашел topic с подобным вопросом об этом, однако алгоритм не является совершенным.

11111111111111111111111111111111 + 
    00000000000000000000000000000000 = 
    00000000000000000000000000000000 //overflow! 

Есть ли простой и быстрый способ проверить это?

+2

https://www.securecoding.cert.org/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow –

ответ

2
long test = (long)x+y; 
if (test > Integer.MAX_VALUE || test < Integer.MIN_VALUE) 
    // Overflow! 
0

Переполнение может быть обнаружено с помощью логического выражения самого значимого бита двух операндов и (усеченного) результата (я принял логическое выражение из руководства MC68030):

/** 
* 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; 
} 
-2

Самый простой способ - присвоить значение целочисленной переменной внутри блока try. Если он превышает 32 бит, будет выбрано исключение.

Boolean ifExceeds32Bit = CheckIfIntExceeds32Bit(4294967296); 

public boolean CheckIfIntExceeds32Bit(int num) 
{ 

try 
    { 
    int testVal = num; 
    return false; 
    }catch(Exception e) 
    { 
    return true; 
    } 
} 
1

Поскольку Java 8 существует множество методов в Math класса: toIntExact (LONG), addExact (интермедиат, INT), subtractExact (целое, целое), multiplyExact (int, int) и версии также долгое время. Они бросают ArithmeticException, если происходит переполнение, они возвращают правильный результат, если он вписывается в диапазон.

Пример добавления:

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