본문 바로가기
public void static main/Java

[JAVA] 타입 캐스팅 시 발생하는 오버플로우?

by 햄리뮤 2024. 12. 22.
반응형

Java에서는 타입 캐스팅을 수행할 때, 특히 정수형 데이터를 더 작은 크기의 정수형으로 캐스팅할 때 오버플로우가 발생할 수 있다.

JVM 내부에서는 이 오버플로우를 특별히 에러로 처리하지 않고, 단순히 값의 하위 비트만 취하는 방식으로 처리한다!

 

처리 과정

  1. 비트 자르기
    • 더 큰 정수형 데이터를 더 작은 정수형으로 캐스팅하면, 상위 비트를 잘라내고 결과적으로 잘린 하위 비트만 새로운 값으로 사용한다.
    • 예를 들어, int를 byte로 변환할 때, int의 하위 8비트만 유지된다.
  2. 값의 손실
    • 상위 비트를 잘라내는 과정에서 정보가 손실될 수 있다.
    • 오버플로우나 언더블로우와 관계없이 자바는 이를 단순히 값 변환으로 간주한다.
  3. 2의 보수 연산 규칙 적용
    • 정수는 자바에서 2의 보수 표현을 사용하므로, 하위 비트를 유지한 결과가 2의 보수 규칙에 따라 계산된 새로운 값으로 나타난다.
public class TypeCastingOverflow {
    public static void main(String[] args) {
        int largeValue = 130;
        byte smallValue = (byte) largeValue;

        System.out.println("Original int value: " + largeValue); // 130
        System.out.println("After casting to byte: " + smallValue); // -126
    }
}

 

분석 해보자!

130의 이진 표현 (32비트, int)

00000000 00000000 00000000 10000010

 

byte로 변환시, 하위 8비트만 유지

10000010 (2의 보수 표현으로 -126)

 

JVM 내부 처리 방식

  • JVM의 정수 연산 명령어를 통해 캐스팅이 수행된다.
  • JVM은 오버플로우 상태를 감지하지 않고 단순히 잘린 하위 비트만 저장한다.
  • 이런 방식은 명시적 타입 캐스팅에 따른 설계된 동작으로 간주한다.

오버플로우를 방지하려면!?

  1. 범위 확인
    • 캐스팅 전에 값이 대상 타입의 범위 내에 있는지 확인한다.
  2. BigInteger 사용
    • 범위를 초과하는 계산이 필요한 경우, BigInteger 클래스를 사용할 수 있다.
  3. ArithmeticException을 통한 명시적 확인
    • 자바 자체적으로 예외를 던지지 않으므로, 직접 범위를 확인하고 예외를 발생시키는 로직을 추가할 수 있다.

2의 보수란?

  • 컴퓨터에서 정수형 데이터를 표현하는 방식 중 하나로, 음수를 나타내기 위한 표준 방법이다.
  • 이 방식을 이해하면 Java에서 타입 캐스팅 시 오버플로우가 발생해도 결과 값이 어떻게 계산되는지 알 수 있다. (좋군!)

그래서 2의 보수가 뭐야!

  • 2의 보수는 음수를 표현하기 위한 이진수 체계 이다.
  • 특정 비트 길이를 기준으로
    • 숫자를 비트 단위로 표현한 후,
    • 각 비트를 반전시킨다. ( 0 -> 1, 1 -> 0)
    • 거기에 1을 더한다.

이 방식으로 음수를 표현하면 컴퓨터는 음수와 양수를 동일한 방식으로 더하거나 빼는 연산이 가능하다.

자 이제 2의 보수로 오버플로우를 이해해보자..!

  • 130의 이진 표현 (32 비트 int)
00000000 00000000 00000000 10000010
  • byte는 비트이므로 하위 8비트만 유지
10000010
  • 이 값은 2의 보수 표현으로 음수를 나타냄
    • 10000010을 다시 음수로 해석하려면
      1. 비트를 반전: 01111101
      2. 1을 더하: 01111110 (십진수 126)
      3. 음수 기호 붙이: -126

결론!

JVM은 하위 비트만 유지하기 때문에, 값이 음수로 바뀌어도 특별히 처리하지 않고 결과를 그대로 사용한다.

2의 보수 표현 덕분에 음수와 양수를 같은 방식으로 계산할 수 있다!

 

 

 

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

댓글