오버플로우(Overflow) & 언더플로우(Underflow)

Joy🌱·2022년 12월 21일
0

☕ Java

목록 보기
3/40
post-thumbnail

👀 오버플로우(Overflow)

💁‍ 오버플로우(Overflow)란,
자료형별 값의 최대 범위를 벗어나는 경우, 초과한 값을 버림처리하고 sign bit을 반전시켜 최소값으로 순환시키는 것

byte num1 = 127;
System.out.println("num1 : " + num1); 
num1++;
>>> num1의 값을 1씩 증가시킨다는 의미
System.out.println("num1 : " + num1);

📌 Ref.

* 127 : byte의 최대 저장 범위
* 결과적으로, Overflow로 인해 128이 아닌 byte의 최소 저장 범위인 -128이 출력됨

👀 언더플로우(Underflow)

💁‍ 언더플로우(Underflow)란,
오버플로우의 반대 개념으로, 최소 범위보다 작은 수를 발생시키는 경우 일어나는 현상

byte num2 = -128;
System.out.println("num2 : " + num2);
num2--; 
 >>> num2의 값을 1씩 감소시킨다는 의미
System.out.println("num2 : " + num2); 

📌 Ref.

* -128 : byte의 최소 저장 범위
* 결과적으로, Underflow로 인해 -129가 아닌 byte의 최대 저장 범위인 127이 출력됨

😈 Warning

오버플로우나 언더플로우는 컴파일 에러, 런타임 에러를 발생시키지 않으므로 
최대값, 최소값 범위를 고려해서 코드를 작성해야함
(동작은 정상으로 되기 때문에 잘못된 것을 눈치채기 어려움)
int firstNum = 1000000;
int secondNum = 700000;
int multi = firstNum * secondNum;
>>> int의 최대값인 약 21억이 이미 넘어버림
System.out.println("multi : " + multi); 
long longMulti = firstNum * secondNum;
>>> 이미 위에서 int로 선언해버렸기 때문에,
System.out.println("longMulti : " + longMulti); 
>>> 결과()는 위와 같을 수 밖에 없음
이미 오버플로우 처리된 결과를 가지고 변수에 담기 때문에 처음 결과와 차이가 없음
그렇다면, 계산이 처리되기 전에 long 타입으로 자료형을 변경해주어야함 (강제 형변환 사용)
long result = (long) firstNum * secondNum;
>>> 다른 변수를 선언과 동시에 (long)으로 강제 형변환
System.out.println("result : " + result); 

🔑 Used Keywords
강제 형변환

profile
Tiny little habits make me

0개의 댓글

관련 채용 정보