알고리즘 문제를 풀다보면 언제나 잊을만 하면 겪게되는 문제가 Integer Overflow 입니다. 종종 발생하지만 직접 찍어보지 않으면 직관적으로 찾기 힘들어서 더 힘들게 하는 문제인데요. 오늘은 이러한 Integer Overflow가 어떻게 일어나는 것인지 한번 정리해보려 합니다.
int a = 2147483647 +1;
System.out.println("a = " + a);
/**
* 출력 결과
* a = -2147483648
*/
위와같이 정수 범위를 넘어가는 값을 처리할 때 Integer Overflow가 일어난다는 사실은 알고 있지만, 정확히 어떠한 과정으로 갑자기 양수에서 뜬금없는 음수값으로 변화하는 것일까요?
과정은 생각보다 간단합니다. 컴퓨터는 정해진 연산만을 하기 때문에 발생합니다.
1Byte Char 형을 예시로 들어보겠습니다.
보통 숫자의 연산은 이러한 과정으로 이루어 집니다.
음수의 경우도 동일합니다.
이렇게 단순히 2진수의 덧셈을 통해 값이 계산되어 나옵니다.
그렇다면 127 + 1의 경우는 어떨까요?
예상과 같이 이진수의 덧셈을 수행하면 최상위 비트 (MSB) 가 1이 되어 -128이 됩니다.
Integer Overflow는 이러한 방식으로 이루어지게 되고 다만 그 결과 값이 예상치 못하게 표현된 것 뿐입니다.
이러한 문제를 해결하는 방법은 무책임 할 순 있겠지만, 각 데이터 타입의 범위에 맞는 값을 가지게끔 연산을 시키면 됩니다.
그럼에도 예상치 못하는 부분에서 오버플로우는 계속해서 일어나고, 비슷한 상황을 많이 겪어보면서 문제 상황에 대한 직관적인 감각을 기르는 것도 오버플로우에 대처하는 방법이라고 생각 합니다.