C #에서 int에 대한 오버플로 예외가 없습니까?
나는 Project Euler (그런데 훌륭한 사이트) 에서 문제 번호 10에 대한 이상한 경험을했습니다 . 할당은 200 만 미만의 모든 소수의 합을 계산하는 것이 었습니다.
합계에 int를 사용했고 내 알고리즘이 답을 생성했지만 답을 확인하기 위해 붙여 넣었을 때 잘못되었습니다.
결과가 너무 커서 int에 맞지 않는 것으로 밝혀졌지만 오버플로 오류 등이 발생하지 않을까요? 대신 실제 답변과는 거리가 먼 값을 반환했습니다.
타입을 long으로 변경했을 때 모든 것이 늠름한 도리였습니다.
C # 정수 연산은 기본적으로 오버플로시 예외를 throw하지 않습니다. 프로젝트 설정을 통해 또는 계산을 통해 얻을 수 있습니다 checked.
int result = checked(largeInt + otherLargeInt);
이제 작업이 발생합니다.
반대는 unchecked이며 모든 작업을 명시 적으로 선택 취소합니다. 분명히 이것은 프로젝트 설정에서 작업을 활성화 한 경우에만 의미가 있습니다.
C #에서는 OverflowException예외가 발생하지 않습니다 (VB에서는 예외가 기본적으로 발생 함).
예외를 얻으려면 checked컨텍스트에 코드를 포함해야합니다 .
byte value = 241;
checked
{
try
{
sbyte newValue = (sbyte) value;
Console.WriteLine("Converted the {0} value {1} to the {2} value {3}.",
value.GetType().Name, value,
newValue.GetType().Name, newValue);
}
catch (OverflowException)
{
Console.WriteLine("Exception: {0} > {1}.", value, SByte.MaxValue);
}
}
MSDN은 다음과 같이 자세히 설명합니다.
산술, 캐스팅 또는 변환 작업에서 OverflowException을 throw하려면 작업이 확인 된 컨텍스트에서 발생해야합니다. 기본적으로 Visual Basic의 산술 연산 및 오버플로가 검사됩니다. C #에서는 그렇지 않습니다. 작업이 확인되지 않은 컨텍스트에서 발생하는 경우 대상 유형에 맞지 않는 상위 비트를 삭제하여 결과가 잘립니다.
기본적으로 C #은 정수 오버플로 및 언더 플로에 대한 예외를 throw하지 않기 때문입니다. 여기에서 할 수있는 몇 가지가 있습니다.
옵션 1
프로젝트 => 속성 => 빌드 탭 => 고급 => 산술 오버플로 언더 플로 확인으로 이동하여 예외를 throw해야합니다 (옵션을 선택했는지 확인하십시오).

옵션을 선택했는지 확인하십시오
옵션 2
확인 된 블록을 사용하고 오버플로 예외를 throw하여 상황을 처리합니다. 샘플 코드 스 니펫은 다음과 같습니다.
try
{
checked
{
int y = 1000000000;
short x = (short)y;
}
}
catch (OverflowException ex)
{
MessageBox.Show("Overflow");
}
catch (Exception ex)
{
MessageBox.Show("Error");
}
이것이 당신을 도울 것입니다 ... :)
이미 cmt를 추가했지만 일부 사용자에게는 흥미로울 수 있습니다.
msdn 은 다음과 같이 알려줍니다.
정수 산술 오버플로는 OverflowException을 throw하거나 결과의 최상위 비트를 버립니다.
그러나
10 진수 산술 오버플로는 항상 OverflowException을 throw합니다.
또한
When integer overflow occurs, what happens depends on the execution context, which can be checked or unchecked. In a checked context, an OverflowException is thrown. In an unchecked context, the most significant bits of the result are discarded and execution continues. Thus, C# gives you the choice of handling or ignoring overflow.
By default, C# does not check for arithmetic overflow on integers. You can change this with the /checked compiler option or by enabling "Check for arithmetic overflow/underflow" in Visual Studio (project properties - Build - Advanced).
You can use checked and unchecked keywords to override the default on a case-by-case basis. If you rely on checking taking place in a piece of code, explicitly enabling it using checked would be a good idea.
int j = checked(i * 2);
checked
{
int j = i * 2;
// Do more stuff
}
참고 부동 소수점 연산은 던져 결코 OverflowException및 소수점 연산은 항상 던져 OverflowException. C # 연산자를 참조하십시오 .
참고 URL : https://stackoverflow.com/questions/2056445/no-overflow-exception-for-int-in-c
'IT TIP' 카테고리의 다른 글
| Ruby에서 배열을 청크하는 방법 (0) | 2020.12.10 |
|---|---|
| 자식 창에서 부모 창 다시로드 (0) | 2020.12.10 |
| 드롭 다운 메뉴의 부트 스트랩 3 화살표 (0) | 2020.12.09 |
| 거꾸로 된 캐럿 (0) | 2020.12.09 |
| glyphicon 및 글꼴이 다른 텍스트가있는 ASP.NET Actionlink (0) | 2020.12.09 |