다음을 통해 공유


확인된 문과 선택되지 않은 문(C# 참조)

checkedunchecked 문은 정수 계열 형식 산술 연산 및 변환에 대한 오버플로 검사 컨텍스트를 지정합니다. 정수 산술 오버플로가 발생하면 오버플로 검사 컨텍스트가 수행되는 동작을 정의합니다. 검사 컨텍스트인 경우 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으로 나누기사용자 정의 검사 연산자 섹션을 참조하세요.

식에 대한 오버플로 검사 컨텍스트를 지정하려면 다음 예제와 같이 checkedunchecked 연산자를 사용할 수도 있습니다.

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.
}

checkedunchecked 문과 연산자는 다음 예제와 같이 문 블록 또는 연산자의 괄호 안에 ‘텍스트’가 있는 작업에 대한 오버플로 검사 컨텍스트에만 영향을 줍니다.

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보다 복잡한 값이나 보수 값을 나타내는 형식floatdoubleHalf 경우 래핑 방법이 적합하지 않습니다. 더 크거나 더 정확한 결과를 계산하는 데 사용할 수 없으므로 unchecked 도움이 되지 않습니다.

float, doubleHalf 컨텍스트에서 오버플로를 감지할 수 있도록 적합한 채도 값을 PositiveInfinity NegativeInfinityunchecked 습니다. 예를 decimal들어 이러한 제한은 존재하지 않으며 포화 상태이 MaxValue 면 오류나 혼란이 발생할 수 있습니다. a 및 unchecked 컨텍스트 모두에서 throw를 checked 사용하는 decimal 작업입니다.

오버플로 검사 컨텍스트의 영향을 받는 작업

오버플로 검사 컨텍스트는 다음 작업에 영향을 줍니다.

기본 오버플로 검사 컨텍스트

오버플로 검사 컨텍스트를 지정하지 않으면 CheckForOverflowUnderflow 컴파일러 옵션의 값이 비규격 식의 기본 컨텍스트를 정의합니다. 기본적으로 이 옵션의 값은 설정되지 않으며 정수 형식 산술 연산 및 변환은 비검사 컨텍스트에서 실행됩니다.

상수 식은 기본적으로 확인된 컨텍스트에서 평가되며 오버플로로 인해 컴파일 시간 오류가 발생합니다. unchecked 문 또는 연산자를 사용하여 상수 식에 대해 비검사 컨텍스트를 명시적으로 지정할 수 있습니다.

C# 언어 사양

자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.

참고 항목