반응형
해당 글은 오버플로우 원인과 해결 방법에 대해 탐구하는 글이다.
int형은 21억xxx이므로 a,b,c 값을 10억씩 넣어주었다.
#case1
좌항 long일때 우항의 합이 int 오버플로우이면 값이 잘 주입될까?
정답 : 우항의 계산중 오버플로우 된값이 좌항에 주입된다.
a+b+c = 30억이 나와야 하지만
우항에서 a+=b; -> a+=c; -> sum= a; 와 같이 실행되므로 오버플로우가 발생한다.
#case2
우항에서 맨 처음 변수에 long타입으로 먼저 형변환을 하면 계산이 잘 될까?
정답 : 우항의 계산이 잘 되어 sum에 주입된다.
(long)a+=b;
(long)a+=c;
반응형
를 실행하면 오버플로우가 발생하지 않고 최종적으로 sum=(long)a 를 할당해줌으로서 무사히 값이 들어간다.
#case3
오버플로우 되는 시점에 딱 형변환이 된 값이 연산되면 될까?
정답 : 그때 변경해주는 것이 포인트다! 잘 계산된다.
아래 예시에서는 b를 더할때 30억이 되면서 오버플로우가 발생하는 것이 맞다고 생각할 수 있다.
하지만 b의값을 long으로 형변환하므로 타입이 맞춰져서a(int)+b(long)=30억이 잘 실행된다.
※ 이때 a의 자료형도 long으로 타입캐스팅 되는 것으로 보여진다.
이후 a(long)+c(int) = 30억+10억 = 40억이 되어 sum에 계산된 값이 잘 주입된다.
자 그러면 아래 예시도 왜 오버플로우인지도 알겠나요?
반응형
'코딩테스트 > Java 문법 정리' 카테고리의 다른 글
Comparator vs Comparable (2) | 2022.03.19 |
---|---|
"Comparable VS Comparator" 비교연산 (0) | 2021.05.24 |
[JAVA] "BufferedReader" VS "Scanner" (0) | 2021.05.03 |
Deque(덱, Double-Ended Queue) (0) | 2021.05.03 |
정규표현식 정리(Java,JS,Python 등) (0) | 2021.03.01 |