먼저 각 자료형 별 값의 범위이다.
|
자료형
|
값의 범위
|
|
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 |