[JAVA] Overflow,타입 간의 변환

Hyeok·2022년 10월 5일
3

JAVA

목록 보기
5/10
post-thumbnail

오늘의 목표

  1. 정수형의 오버 플로우
  2. 부호있는 정수의 오버플로우
  3. 타입 간의 변환

만일 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. 부호있는 정수의 Overflow

부호없는 정수와 부호있는 정수는 표현범위 즉, 최대값과
최소값이 다르기 때문에 오버플로우가 발생하는 시점이 다르다.
부호 없는 정수는 2진수로 '0000'이 될 때 오버플로우가 발생하고 ,부호 있는 정수는 부호비트가 0에서 1이 될 때 오버플로우가 발생한다.

2-1 Ex1)

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타입의 결과값을 알아보았다.

3.타입 간의 변환

타입 간의 변환은 프로그램에서 자주 사용되므로 반드시 정리해서 알아두자.

  1. 숫자를 문자로 변환 - 숫자에 '0'을 더한다.
(char)(3+'0') -> '3'
  1. 문자를 숫자로 변환 -> 문자엣 '0'을 뺀다.
'3' - '0' -> 3
  1. 숫자를 문자열로 변환 -> 숫자에 빈 문자열(" ")을 더한다.
3 + " " -> "3"
  1. 문자열을 숫자로 변환 - integer.parselint() or Double.parseDouble()사용
Integer.parseInt("3") -> 3
  1. 문자열을 문자로 변환 - charAt(0)을 사용한다.
"3".charAt(0) -> '3'
  1. 문자를 문자열로 변환 - 빈 문자열(" ")을 더한다.
'3' + " " -> "3"

3-1 Ex1)

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
	}

}

위와같은 결과값을 얻을 수 있으며 잘 정리해서 잘 알아둬야한다.

profile
안녕하세요.

0개의 댓글

관련 채용 정보