본문 바로가기
코딩 책공부/초보자를 위한 C# 200제 2판

OverflowException과 checked키워드

by FourthWay 2024. 4. 17.
728x90
반응형

namespace _066_A019_Overflow
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("int.MaxValue = {0}", int.MaxValue);
            int x = int.MaxValue, y = 0;
            y = x + 10;
            Console.WriteLine("int.MaxValue + 10 = {0}", y);
        }
    }
}

 

        static void Main(string[] args)
        {
            Console.WriteLine("int.MaxValue = {0}", int.MaxValue);

- int.MaxValue를 출력한다. int.MaxValue는 부호를 갖는 32비트 정수가 표현할 수 있는 최대값으로 2,147,483,647이다.
            int x = int.MaxValue, y = 0;
            y = x + 10;

- int.MaxValue에 10을 더한 값을 y에 할당한다. int의 최대값보다 더 큰 값이므로 오버플로우가 발생한다.

하지만 출력은 오버플로우 메시지 없이 엉뚱한 값인 -2147483639를 출력한다.

이때 출력되는 -214774883639는 다음과 같은 결과이다.
            Console.WriteLine("int.MaxValue + 10 = {0}", y);
        }

 

  int.MaxValue(2,147,483,647) 0111  1111  1111  1111  1111  1111  1111  1111
+ 10 0000 0000 0000  0000 0000  0000 0000 1010
  -2147483639 1000 0000 0000  0000 0000  0000 0000 1001

 

 

32비트의 비트 패턴은 위와 같이 "1000 0000 0000 0000 0000 0000 0000 10001"인데 맨 앞자리는 부호를 나타내므로 이 수는 음수 -2147483639로 해서되는 것이다.

 

오버플로 메시지를 표시하기 위해서는 checked 키워드를 사용해야 한다.

 

namespace _066_A019_Overflow
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = int.MaxValue, y = 0;

            checked
            {
                try
                {
                    y = x + 10;
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
            Console.WriteLine("int.MaxValue + 10 = {0}", y);
        }
    }
}

 

        static void Main(string[] args)
        {             

            // y = int.MaxValue + 10;    //이 문장은 컴파일할 때 에러가 나온다

- y = int.MaxValue + 10; 이라는 문장을 쓴다면 이미 상수 값이 정수의 범위를 넘어선 것을 알 수 있기 때문에  컴파일 할 때 에러가 발생한다.
            int x = int.MaxValue, y = 0;

            checked

- checked 키워드를 사용하면오버플로 예외를 발생시킨다 checked를 사용하지 않으면 디폴트로 unchecked상태가 되어 결과의 가장 중요한 비트 (MSB)가 무시되고 실행이 계속된다.
            {
                try
                {
                    y = x + 10;
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                }

- try~catch 문으로 예외가 발생하면 어떤 예외인지 출력한다. 오버플로가 발생했다는 메시지를 출력한다.
            }
            Console.WriteLine("int.MaxValue + 10 = {0}", y);

- 오버플로가 발생한 변수 y의 값은 0으로 출력된다.
        }

 

 

정수 오버플로가 발생할 경우 수행되는 작업은 checked 또는 unchecked에 따라 달라진다.

checked를 사용하면 OverflowException이 throw된다. unchecked컨텍스트에서는 결과의 가장 중요한 비트가 무시되고 실행이 계속된다. 디폴트는 unchecked 이다.

 

산술 연산자 외에도 정수 계열 형식 간 캐스팅 (예: long을 int로 캐스팅)은 오버플로를 발생시키고 checked 또는 unchecked 실행이 적용될 수 있다. 그러나 비트 연산자와 시프트 연산자는 오버플로를 발생시키지 않는다.

Decimal 변수의 산술 연산 오버플로는 항상 OverflowException을 throw 한다.

또한 Decimal을 0으로 나누면 항상 DivideByZeroException이 throw 된다.

 

 

초보자를 위한 C# 200제, 정보문화사

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

 

초보자를 위한 C# 200제

COUPANG

www.coupang.com

 

728x90
반응형

'코딩 책공부 > 초보자를 위한 C# 200제 2판' 카테고리의 다른 글

관계연산자  (2) 2024.04.18
DivideByZeroException과 try~catch문  (0) 2024.04.16
산술연산자  (0) 2024.04.15
C#의 연산자와 식  (0) 2024.04.11
Convert 클래스와 2진수, 8진수, 16진수 출력  (0) 2024.04.04