[20210522] Java에서 overflow 다루는 방법

Overflow란 무엇이며, java에서 overflow를 다루는 방법을 알아보자.

Overflow

사전적 정의로는 넘쳐흐른다는 의미이다. 프로그래밍 관점에서보면 변수에는 저장할 수 있는 범위가 있는데 이를 벗어난 것을 의미한다. 범위를 넘어갔다고 해서 예외가 발생하는 것이 아니기에 잘 알아차리기 어려울 수도 있다.

Overflow 예외처리

java.util.Math 에서 overflow를 예외처리 해주는 함수들이 존재한다. overflow가 발생한다면 AlrithmeticException이 발생한다.

  • decrementExact(int) or (long)
  • incrementExact(int) or (long)
  • addExact(int, int) or (long, long)
  • subtractExact(int, int) or (long, long)
  • multiplyExact(int, int) or (long, long)
  • negateExact(int) or (long)
  • toIntExact(long)

java에서도 범위에 벗어난 연산을 했다고해서 예외가 발생하는 것이 아니기에 일일이 overflow 여부를 확인해야 한다.
decrement, increment는 어느정도 예상이 간다. 만약 인자 값이 Integer.MAX_VALUE or Integer.MIN_VALUE 라면 예외를 발생 시킨다.
add의 경우 overflow가 발생하는 경우는 (양수) + (양수) = (음수) or (음수) + (음수) = (양수) 이다. 그래서 (x ^ r) & (y ^ r)) < 0 이면 예외를 발생시킨다. subtract의 경우 overflow가 발생하는 경우는 (양수) - (음수) = (음수) or (음수) - (양수) = (양수) 이다. 그래서 (x ^ y) & (x ^ r)) < 0 이면 예외를 발생시킨다. multiply의 경우에 int는 long으로 타입 변환을 해서 곱한 결과가 원래의 결과와 같은지 비교한다. negate의 경우 변수의 범위가 2의 보수의 특성상 음수의 절대값이 1이 더 크므로 음수의 최대값에서 negate를 하면 overflow가 발생하므로 음수의 최대값에서만 예외를 발생시킨다.


출처

https://stackoverflow.com/questions/21233582/how-can-i-detect-integer-overflow-on-32-bits-int