정리가 필요한 카테고리(추후 정리)/C#,Unity

C#] 정수 Overflow와 checked, unchecked 연산자

TwinParadox 2016. 12. 31. 18:10
728x90

실행 시점에서 정수 형식에 대한 산술 연산이 형식에 담을 수 없을 정도로 크거나 작을 수 있음.

이 경우 overflow가 발생하는데, 이 경우, 어떠한 예외도 던져지지 않고,

연산의 결과는 끝에서 끝으로 순환(wraparound)됨.


더 큰 정수 형식으로 연산을 수행한 후, 여분의 유효 자리 비트들을 폐기한 것과 같은 결과가 나오는 것이 대표적인 예


1
2
3
int a = int.Minvalue;
a--;
Console.WirteLine (a == int.MaxValue);
cs



이러한 경우의 예외 처리를 해주고 싶을 때 checked 연산자를 이용하면 예외 처리가 가능하다.



checked 연산자 / unchecked 연산자

표현식이나 문장에 checked 연산자를 지정하면, 실행시점에서 해당 형식의 산술 한계를 넘는 연산이 나타났을 때,

OverflowException 예외가 던져지며, checked연산자는 ++, --, +, -, *, / 연산자와 정수 형식들 사이의 명시적 변환 연사자들이 표현식에 영향을 미침.

그러나, double, float, decimal 형식에는 어떤 영향도 미치지 않음.


해당 연산자는 표현식 하나에 적용할 수도 있고, 문장 블록에 적용할 수도 있음.


1
2
3
4
5
6
7
8
9
10
11
int a = 1000000;
int b = 1000000;
 
int c = checked (a * b); // 해당 표현식만 점검
int d;
 
checked // 블록 안의 모든 표현식 점검
{
    c = a * a;
    d = a * b;
}
cs



이렇게 부분부분 지정하지 않고, 프로그램의 모든 표현식에 대해서도 점검이 적용되게 하는 것도 가능하며,

이는 프로그램 컴파일 시 명령줄 스위치 \checked+를 지정하면 됨.

(Visual Studio에서는 '고급 빌드 설정' 대화상자에서 이를 설정할 수 있음)

이처럼 일괄적으로 표현식과 문장에 대해 점검이 이뤄질 때,

예외 처리를 던지지 않길 원하는 부분은 unchecked 연산자를 checked처럼 사용하여 처리해줄 수 있음.


unchecked 연산자를 사용할 경우,

\checked 컴파일러 스위치와 무관하게 컴파일 시점에서 평가되는 오버플로우 점검에 대해서도

점검을 생략할 수 있으며, 그 예는 아래와 같다.



1
2
int x = int.MaxValue + 1// 컴파일 시점 에러
int y = unchecked (int.MaxValue + 1); // 에러 없음
cs

 

728x90