Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

19. OverflowException과 checked 키워드 본문

초보자를 위한 C# 200제/C# 입문

19. OverflowException과 checked 키워드

빌드이너프 2024. 9. 22. 11:58

오버플로 예외 처리

int.MaxValue는 부호를 갖는 32비트 정수가 표현할 수 있는 최대 값으로 2,147,483,647을 갖는다.

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

 

하지만 출력은 오버플로우 메시지 없이 -2147483639가 발생함.

 

예외처리 전 코드

using System;

namespace 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);
        }
    }
}

 

예외처리 전  실행 결과


예외처리 후 코드

using System;

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

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

 

예외처리 후 실행결과


정리

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

 

checked를 사용하면 OverflowException이 throw된다.

unchecked 컨텍스트에서는 결과의 가장 중요한 비트가 무시되고 실행이 계속된다(디폴트는 unchecked)

 

산술 연산자 외에도 정수 계열 형식 간 캐스팅(long -> int)은 오버플로를 발생시키고 checked 또는 unchecked 실행이 적용될 수 있다.

다만 비트 연산자와 시프트 연산자는 오버플로를 발생시키지 않는다.

 

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

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