037 두 큰 int/long 수의 곱과 연산 오버플로
다음 예제처럼 * 연산자를 활용하는 해법부터 살펴보자.
int x = 10;
int y = 5;
int z = x * y; // 50
아주 단순한 방식이며 int와 long, 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으로 바꿔도 문제는 해결되지 않는다. 하지만 x와 y의 타입을 둘 다 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
* 연산자를 사용하는 계산에서 도메인을 초과하면 원하지 않는 결과로 이어진다.