더북(TheBook)

037 두 큰 int/long 수의 곱과 연산 오버플로

 

다음 예제처럼 * 연산자를 활용하는 해법부터 살펴보자.

int x = 10;
int y = 5;
int z = x * y; // 50

아주 단순한 방식이며 intlong, float, double을 포함하는 대부분의 계산에 잘 동작한다.

이제 * 연산자를 다음의 두 큰 수에 적용해보자(2,147,483,647을 두 번 곱한다).

int x = Integer.MAX_VALUE;
int y = Integer.MAX_VALUE;
int z = x * y; // 1

z는 원하던 결과인 4,611,686,014,132,420,609가 아니라 1이다. z의 타입을 int에서 long으로 바꿔도 문제는 해결되지 않는다. 하지만 xy의 타입을 둘 다 int에서 long으로 바꾸면 해결된다.

long x = Integer.MAX_VALUE;
long y = Integer.MAX_VALUE;
long z = x * y; // 4611686014132420609

그래도 Integer.MAX_VALUE 대신 Long.MAX_VALUE를 쓰면 같은 문제가 다시 발생한다.

long x = Long.MAX_VALUE;
long y = Long.MAX_VALUE;
long z = x * y; // 1

* 연산자를 사용하는 계산에서 도메인을 초과하면 원하지 않는 결과로 이어진다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.