만일 4bit 2진수의 최대값인 '1111'에 1을 ㄹ더하면 어떤 결과를 얻을까?
4 bit의 범위를 넘어서는 값이 되기 때문에 에러가 발생할까? 알아보자
원래 2진수 '1111'에 1을 더하면 '10000'이 되지만 , 4bit로는 4자리의 2진수만 저장이 가능하기때문에 '0000'이 된다. 즉, 5자리의 2진수 '10000'중에서 하위 4bit만 저장된다.
이처럼 해당 타입이 표현할 수 있는 값의 범위를 넘어서는 것을 Overflow라고 한다.
오버플로우는 '자동차 주행표시기(odometer)'나. '계수기(counter)'등 우리의 일상생활에서 도 발견 할 수 있는데. 4자리 계수기라면 '0000'~'9999'까지 밖에 표현할 수 없다 그 다음 숫자는 '0000'이기때문에 그 앞의 숫자 1은 버려진다.
그럼 반대로 -1를 하면 어떤일이 벌어질까?
결과는 위와같이 네 자리로 표현할 수 있는 최대값이 된다.
이는 마치 계수를 거꾸로 돌리는 것과 같다.
'0000'에서 정방향으로 돌리면 '0001'이되지만 역방향으로 돌리면 '9999'가 된다.
결론적으로 정수형 타입이 표현할 수 있는 최대값에 1을 더하면 최소값이 되고,
최소값에서 1을 빼면 최대값이 된다.
부호없는 정수와 부호있는 정수는 표현범위 즉, 최대값과
최소값이 다르기 때문에 오버플로우가 발생하는 시점이 다르다.
부호 없는 정수는 2진수로 '0000'이 될 때 오버플로우가 발생하고 ,부호 있는 정수는 부호비트가 0에서 1이 될 때 오버플로우가 발생한다.
class Ex2_11 {
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);
}
}
위와같이 short타입과 char타입의 결과값을 알아보았다.
타입 간의 변환은 프로그램에서 자주 사용되므로 반드시 정리해서 알아두자.
(char)(3+'0') -> '3'
'3' - '0' -> 3
3 + " " -> "3"
Integer.parseInt("3") -> 3
"3".charAt(0) -> '3'
'3' + " " -> "3"
public class Ex2_17 {
public static void main(String[] args) {
String string = "3";
System.out.println('3' - '0'); //(string.charAt(0) >>> '3'
System.out.println('3' - '0' + 1); // '3'-'0' => 3 + 1 >>> 4
System.out.println(Integer.parseInt("3")+ 1); // "3" => 3 + 1 >>> 4
System.out.println("3" + 1); // "3" + "1" >>> 31
System.out.println(3 + '0'); // '0'은 숫자로 48
}
}
위와같은 결과값을 얻을 수 있으며 잘 정리해서 잘 알아둬야한다.