오버플로우(overflow)란? 타입이 표현할 수 있는 값의 범위를 넘어서는 것을 말한다.
4bit
10진수
9999 + 1 = (1)0000 (저장할 공간이 없어서 1은 버려짐)
(1)0000 - 1 = 9999 (저장되지 않은 1이 있다고 가정)
2진수
1111 + 1 = (1)0000 (저장할 공간이 없어서 1은 버려짐)
(1)0000 - 1 = 1111 (저장되지 않은 1이 있다고 가정)
최대값 + 1 -> 최소값
최소값 - 1 -> 최대값
4bit 2진수의 최소값인 '0000'부터 시작해서 1씩 계속 증가하다가 최대값인 '1111'을 넘으면 다시 '0000'이 된다.
값을 1씩 계속 증가시켜도 '0000'과 '1111'의 범위를 벗어나지 않는다.
부호있는 정수의 최대값과 최소값이 다르기 때문에 오버플로우가 발생하는 시점이 다르다.
부호없는 정수는 2진수로 '0000'이 될 때 발생하고, 부호있는 정수는 부호비트가 0에서 1이 될 때 발생한다.
부호없는 정수(4bit) 표현범위 : 0 ~ 15
최대값 : 15(10진수), 1111(2진수)
최소값 : 0(10진수), 0000(2진수)
-->오버플로우 발생
부호있는 정수(4bit) 표현범위 : -8 ~ 7
최대값 : 7(10진수), 0111(2진수)
최소값 : -8(10진수), 1000(2진수)
-->오버플로우 발생
public static void main(String[] args) {
short sMin = -32768, sMax = 32767;
char cMin = 0, 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
Max = 32767
sMax+1= -32768
cMin = 0
cMin-1= 65535
cMax = 65535
cMax+1= 0
최소값에서 1을 빼면 최대값이 되고, 최대값에서 1을 더하면 최소값이 된다는걸 꼭 알아두자.