Java

정수 오버플로우

오개발 2024. 10. 18. 13:17

 

먼저 각 자료형 별 값의 범위이다.

 

자료형
값의 범위
char
0 ~ 65535 ('\u0000' ~ '\uffff')
byte (1byte)
-128 ~ 127 (-2^7 ~ 2^7 -1)
short (2byte)
-32,768 ~ 32,767 (-2^15 ~ 2^15 - 1) 
int (4byte)
-2,147,483,648 ~ 2,147,483,647 (-2^31 ~ 2^31 -1)
long (8byte)
-9,223,372,036,854,774,808 ~ 9,223,372,038,854,775,807 (-2^63 ~ 2^63 -1)
float (4byte)
1.4E-45 ~ 3.4E38 (1.4 * 10^-45 ~ 3.4 * 10^38)
double (8byte)
4.9E-324 ~ 1.8E308 (4.9 * 10^-324 ~ 1.8 * 10^308)

 

1byte당 8Bit이다. 

 

오버 플로우란 각 자료형에 대한 값의 범위를 넘어서 예상 하지 못한 값이 나왔을때를 말한다.

 

 

아래와 같은 예시를 봤다.

 

public class My_magazine {
	public static void main(String[] args) {
		byte num = 127;
		System.out.println("num의 값 :"+ num);
		num++;
		System.out.println("num의 값 :"+ num);
	}
}

 

 

num의 값 :127
num의 값 :-128

 

 

++ 를 하니 -128이 되었다. 오버 플로우가 발생 하였다.

 

자료형의 허용 범위를 넘어버리면 오버플로우가 발생한다. byte의 값 범위는 -128 ~ 127 이다.

127를 2진수로 변환하면 01111111이 나온다.

총 8자리이고, 127 값이 나오는 계산법은 다음과 같다.

 

8자리의 값이 있으니 8bit라고 한다.

 

2진수 기준으로 01111111 값으로 왜 127값이 나오는지 다음 표와 같다.

 

 

 

총 8자리이고, 첫번째 자리가 0 값이다. 하지만 첫번째 자리의 비트(최상위 비트)를 Most Significant Bit(MSB)라 부르며 이 비트는 부호(+, -)를 결정하는데 사용한다.

이런 이유로 맨 왼쪽 비트는 수를 표현하는데 사용하지 못하며, 이 비트를 제외한 모든 값이 1이 된 수(127)이 1byte의 최대값이 되는 것이다.

맨 왼쪽의 비트가 0이라면 양수, 1이라면 음수라는 뜻이다

 

그러므로 왼쪽의 값은 빼고 나머지는 전부 1이다. 그러므로 다음과 계산법이다.

 

64 + 32 + 16 + 8 + 4 + 2 + 1 = 127 이렇게 해서 최대 값이 127이다.

 

 

01111111[127] + 1 = 10000000[-128]이 되고,

반대로 -128에 1을 빼게 되면

10000000[-128] - 1 = 01111111[127]이 된다.

 

 

'Java' 카테고리의 다른 글

UTF 인코딩  (0) 2024.10.28
2진수와 16진수 +@ 10진수  (0) 2024.10.18
시멘틱 버저닝  (0) 2024.10.18
상속보다 컴포지션(조합)을 사용하라  (0) 2024.10.17
오버라이딩의 응용  (0) 2024.10.16