충분히 쌓여가는
19. OverflowException과 checked 키워드 본문
오버플로 예외 처리
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 된다.
'초보자를 위한 C# 200제 > C# 입문' 카테고리의 다른 글
24. 증가연산자, 감소연산자, 대입연산자의 압축 (0) | 2024.09.23 |
---|---|
21. 논리연산자 (1) | 2024.09.22 |
18. DivideByZeroException과 try~catch문 (0) | 2024.09.21 |
17. 산술연산자 (0) | 2024.09.12 |
16. C#의 연산자와 식 (0) | 2024.09.12 |