오버 플로우란?
해당 타입의 범위를 넘어서는 것을 오버플로우라고 한다.
오버플로우는 에러가 발생하지 않지만 예상과 다른 결과가 나온다.
정수형
정수형의 저장 형식과 범위
저장 형식
- S : 부호 비트 (양 : 0, 음: 1)
- N : 타입의 크기(bit)
범위
- byte : -128 ~ 127 (2^7 ~ 2^7-1)
- short : -32,768 ~ 32,767 (2^15 ~ 2^15-1)
- int : - 2,147,483,648 ~ 0 ~ 2,147,483,647 (2^31 ~ 2^31-1)
- long : -9,223,372,036,854,775,808 ~ 0 ~ 9,223,372,036,854,775,807 (2^63 ~ 2^63-1)
정수형의 선택 기준
- JVM의 피연산자 스택(operand stack)이 피연산자를 4byte단위로 저장하기 때문에 int를 사용하는 것이 효율적이다.
정수형의 오버 플로우
2진수 1111 + 0001 = 10000이다.
하지만 2진수는 4bit를 범위로 가지고 있어서 0000이 된다.
반대로 0000 - 0001 = 9999이다.
즉, 최대값 + 1 = 최소값이 되고 최소값 - 1 = 최대값이 된다.
부호 없는 정수 | 2진수 | 부호 있는 정수 | ||
0 | 0000 | 0 | ||
1 | 0001 | 1 | ||
2 | 0010 | 2 | ||
3 | 0011 | 3 | ||
4 | 0100 | 4 | ||
5 | 0101 | 5 | ||
6 | 0110 | 6 | ||
7 | 0111 | 7 | 오버 플로우 발생 | |
8 | 1000 | -8 | ||
9 | 1001 | -7 | ||
10 | 1010 | -6 | ||
11 | 1011 | -5 | ||
12 | 1100 | -4 | ||
13 | 1101 | -3 | ||
14 | 1110 | -2 | ||
오버 플로우 발생 | 16 | 1111 | -1 | |
0 | 0000 | 0 | ||
1 | 0001 | 1 | ||
2 | 0010 | 2 |
- 부호 없는 정수 -> char 0 ~ 65,535
- 부호 있는 정수 -> short -32,768 ~ 32,767
실수형의 저장 형식과 범위
저장 형식
- S (Sign) : 부호
- E (Exponent) : 지수
- M (Mantissa) : 가수
float
- 저장 형식 : S(1) + E(8) + M(23) = 32bit (8byte)
- 범위 : 1.4E-45 ~ 3.4E38
double
- 저장 형식 : S(1) + E(11) + M(52) = 64bit (16byte)
- 범위 : 4.9E-324 ~ 1.8E308
실수형의 오버 플로우, 언더 플로우
- 오버 플로우 : 무한대 (infinity)
- 언더 플로우 : 양의 최소값보다 작은 값으로 0이 된다.
'개발 언어 > Java' 카테고리의 다른 글
[Java] 형변환 (0) | 2021.08.18 |
---|---|
[Java] 실수형의 소수점 표현 방식과 BigDecimal (0) | 2021.08.13 |
[Java] 상수와 리터럴 (0) | 2021.08.11 |
[Java] 기본형과 참조형 (0) | 2021.08.11 |
[Java] 명명 규칙 (0) | 2021.08.11 |