<오버플로우(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