확인된 문과 선택되지 않은 문(C# 참조)
checked
및 unchecked
문은 정수 계열 형식 산술 연산 및 변환에 대한 오버플로 검사 컨텍스트를 지정합니다. 정수 산술 오버플로가 발생하면 오버플로 검사 컨텍스트가 수행되는 동작을 정의합니다. 검사 컨텍스트인 경우 System.OverflowException이 throw됩니다. 상수 식에서 오버플로가 일어나면 컴파일 시간 오류가 발생합니다. 비검사 컨텍스트에서는 대상 형식에 맞지 않는 상위 비트를 삭제하여 작업 결과가 잘려집니다. 예를 들어 더하기는 최대값에서 최소값으로 래핑됩니다. 다음 예에서는 확인된 컨텍스트와 확인되지 않은 컨텍스트 모두에서 동일한 작업을 보여 줍니다.
uint a = uint.MaxValue;
unchecked
{
Console.WriteLine(a + 3); // output: 2
}
try
{
checked
{
Console.WriteLine(a + 3);
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
참고 항목
사용자 정의 연산자 및 변환의 오버플로 동작은 이전 단락에 설명된 것과 다를 수 있습니다. 특히 사용자 정의 검사 연산자는 검사 컨텍스트에서 예외를 throw하지 않을 수 있습니다.
자세한 내용은 산술 연산자 문서의 산술 오버플로 및 0으로 나누기 및 사용자 정의 검사 연산자 섹션을 참조하세요.
식에 대한 오버플로 검사 컨텍스트를 지정하려면 다음 예제와 같이 checked
및 unchecked
연산자를 사용할 수도 있습니다.
double a = double.MaxValue;
int b = unchecked((int)a);
Console.WriteLine(b); // output: -2147483648
try
{
b = checked((int)a);
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
checked
및 unchecked
문과 연산자는 다음 예제와 같이 문 블록 또는 연산자의 괄호 안에 ‘텍스트’가 있는 작업에 대한 오버플로 검사 컨텍스트에만 영향을 줍니다.
int Multiply(int a, int b) => a * b;
int factor = 2;
try
{
checked
{
Console.WriteLine(Multiply(factor, int.MaxValue)); // output: -2
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message);
}
try
{
checked
{
Console.WriteLine(Multiply(factor, factor * int.MaxValue));
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
앞의 예제에서 Multiply
로컬 함수의 첫 번째 호출은 예외가 throw되지 않으므로 checked
문이 Multiply
함수 내의 오버플로 검사 컨텍스트에 영향을 주지 않는다는 것을 보여 줍니다. Multiply
함수의 두 번째 호출에서 함수의 두 번째 인수를 계산하는 식은 검사된 컨텍스트에서 계산되고 checked
문의 블록 내에 텍스트가 포함되므로 예외를 발생시킵니다.
동작 checked
은 형식 및 unchecked
작업에 따라 달라집니다. 정수의 경우에도 합리적인 동작이 없으므로 항상 throw하는 것과 같은 unchecked(x / 0)
작업이 있습니다. 형식 및 작업에 대한 동작을 확인하여 코드와 unchecked
키워드가 코드에 checked
미치는 영향을 파악합니다.
숫자 형식 및 오버플로 검사 컨텍스트
및 unchecked
키워드는 checked
주로 합리적인 오버플로 동작이 있는 정수 형식에 적용됩니다. 두 가지의 보수 값에 따라 배치되는 T.MinValue
랩어라운드 동작 T.MaxValue + 1
이 합리적입니다. 표시된 값은 형식의 스토리지에 맞지 않으므로 올바르 지 않습니다. 따라서 비트는 전체 결과의 하위 n 비트를 대표합니다.
decimal
보다 복잡한 값이나 보수 값을 나타내는 형식float
double
의 Half
경우 래핑 방법이 적합하지 않습니다. 더 크거나 더 정확한 결과를 계산하는 데 사용할 수 없으므로 unchecked
도움이 되지 않습니다.
float
, double
및 Half
컨텍스트에서 오버플로를 감지할 수 있도록 적합한 채도 값을 PositiveInfinity
NegativeInfinity
갖 unchecked
습니다. 예를 decimal
들어 이러한 제한은 존재하지 않으며 포화 상태이 MaxValue
면 오류나 혼란이 발생할 수 있습니다. a 및 unchecked
컨텍스트 모두에서 throw를 checked
사용하는 decimal
작업입니다.
오버플로 검사 컨텍스트의 영향을 받는 작업
오버플로 검사 컨텍스트는 다음 작업에 영향을 줍니다.
피연산자가 정수 형식(즉, 정수 또는 char 형식)이거나 enum 형식인 경우 기본 제공 산술 연산자: unary
++
,--
,-
및 binary+
,-
,*
및/
연산자.정수 형식 사이,
float
또는double
에서 정수 형식으로의 명시적 숫자 변환참고
decimal
값을 정수 형식으로 변환하고 결과가 대상 형식의 범위를 벗어나면 오버플로 검사 컨텍스트에 관계없이 항상 OverflowException이 throw됩니다.C# 11부터는 사용자 정의검사 연산자 및 변환이 있습니다. 자세한 내용은 산술 연산자 문서의 사용자 정의 검사 연산자 섹션을 참조하세요.
기본 오버플로 검사 컨텍스트
오버플로 검사 컨텍스트를 지정하지 않으면 CheckForOverflowUnderflow 컴파일러 옵션의 값이 비규격 식의 기본 컨텍스트를 정의합니다. 기본적으로 이 옵션의 값은 설정되지 않으며 정수 형식 산술 연산 및 변환은 비검사 컨텍스트에서 실행됩니다.
상수 식은 기본적으로 확인된 컨텍스트에서 평가되며 오버플로로 인해 컴파일 시간 오류가 발생합니다. unchecked
문 또는 연산자를 사용하여 상수 식에 대해 비검사 컨텍스트를 명시적으로 지정할 수 있습니다.
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.
참고 항목
.NET