<오버플로우(overflow)>
정수형 데이터 타입 중 크기가 8bit인 byte의
최대값 127에 1을 더하면 어떻게 될까?
byte의 표현할 수 있는 최대값을 넘는 값(128)이 되었기 때문에
Java에서 에러가 날 것 같지만 실행결과는 아래와 같다.
System.out.println((byte)(127 + 1));
[실행결과]
-128
최소값이 출력된다.
오버플로우(overflow)가 발생된 것이다.
System.out.println((byte)(-128 - 1));
[실행결과]
127
위와 같이 최소값에서 1을 빼도 에러가 나지 않고
최대값이 출력된다.
연산과정에서 해당 타입이 표현할 수 있는 값의 범위를
넘어서는 것을 오버플로우(overflow)라고 한다.
System.out.println((short)(32767 + 1));
System.out.println((int)(2147483647 + 1));
System.out.println((long)(9223372036854775807L + 1));
[실행결과]
-32768
-2147483648
-9223372036854775808
byte 뿐만 아니라 다른 타입도 마찬가지로
최대값에 1을 더하면 오버플로우 되어 최소값이 된다.
System.out.println((byte)(127 + 1));
System.out.println((byte)(127 + 129));
System.out.println((byte)(127 + 256));
System.out.println((byte)(127 + 385));
System.out.println((byte)(127 + 513));
[실행결과]
-128
0
127
0
-128
1
더 큰 수를 더해도 최대값과 최소값을 반복하며
계속 오버플로우 된다.
음수의 2진 변화에서 학습한 것과 마찬가지로
부호가 있는 정수형의 2진수는
가장 왼쪽의 1bit는 부호를 결정하며,
나머지 비트가 값을 표현한다.
0111_1111은 양수의 최대값이며,
그 값에 1일 더한 1000_0000은
음수의 최소값이 된다.
이때 오버플로우가 발생되는 것이다.
아래와 같은 경우도 전부 오버플로우 된 것이다.
<예제 2-9 OverFlowEx>
public class P067_OverFlowEx {
public static void main(String[] args) {
short sMin = -32768;
short sMax = 32767;
char cMin = 0;
char cMax = 65535;
System.out.println("sMin = " + sMin);
System.out.println("sMin-1= " + (short)(sMin-1));
System.out.println("sMax = " + sMax);
System.out.println("sMax+1= " + (short)(sMax+1));
System.out.println("cMin = " + (int)cMin);
System.out.println("cMin-1= " + (int)--cMin);
System.out.println("cMax = " + (int)cMax);
System.out.println("cMax+1= " + (int)++cMax);
}
}
[실행결과]
sMin = -32768
sMin-1= 32767
sMax = 32767
sMax+1= -32768
cMin = 0
cMin-1= 65535
cMax = 65535
cMax+1= 0
'. Java의 정석' 카테고리의 다른 글
[Java] 연산자의 분류 (0) | 2021.07.06 |
---|---|
[Java] 연산자의 정의와 피연산자 (0) | 2021.07.06 |
[Java] 정수형 데이터 타입 : 부호 비트와 값의 표현 (0) | 2021.07.05 |
[Java] 문자 코드 : 아스키, 확장아스키, 코드페이지, 유니코드 (0) | 2021.07.05 |
[Java] 문자형 데이터 타입 char : 특수 문자(기호) (0) | 2021.07.04 |