반응형
int 형의 범위는 약 -21억부터 ~ 21억 까지 이다.
만약에 아래의 경우의 평균을 구하면 어떤 값이 나올까? (조건, num1과 num2는 각 각 int형의 최대값을 넘기지 않는다.)
int num1 = 2_100_000_000;
int num2 = 2_100_000_000;
int avg = (num1 + num2) / 2;
System.out.println("평균 값 : " + avg);
실행 결과
-47,483,648 // 쓰레기 값이 나오게 된다.(오버플로우)
기대 했던 값은 20억이지만, 21억을 넘어가면서 오버플로우가 발생해서 -147.. 값이 나오게 되는 것이다.
그렇다면, 이를 방지할 평균 구하는 방법은 ?
int num1 = 2_100_000_000;
int num2 = 2_100_000_000;
int avg = num1 - (num1 - num2) / 2;
System.out.println(avg);
실행결과
2,100,000,000
원리는?
첫번째 수에서 첫번째 수와 두번째 수를 빼고 2로 나눈 값을 빼주면 된다.
풀어서 쓰면 각 숫자를 2로 나눈 다음 더해주면 된다.
반응형