정수 부서에서 오버 플로 엑스크가 던져지는 것을 어떻게 멈출 수 있습니까?
-
18-09-2019 - |
문제
나는 얻고있다 Overflowexception내가 그들을 원하지 않을 때 나에게 던져졌다. 나는 값이 오버플로, 오버플로 된 비트를 버릴 것으로 예상하는 이상한 계산을 수행하고 있습니다. 그래도 이것을 제대로 작동시킬 수는 없습니다. 기본적으로 이것은 거대한 세트를 반복 할 때 발생하는 I와 J 쌍입니다 (int.minValue to int.MaxValue).
// i and j are ints
// i is -2147483648
// j is -1
var x = i / j;
// I also tried using unchecked keyword, but it doesn't help
var x = unchecked(i / j);
업데이트:
-2147483648 / -1의 예상 수학 값은 2147483648입니다. 그러나이 특정 코드는 실제로 숫자를 찾으려고 시도하지 않습니다. 이것은 일련의 비트 조작의 일부입니다. 이해하기 어려운 일이 조금 어려워졌습니다. 솔직히 말해서, 나는 그 방법을 실제로 문서화하지 않았기 때문에 의도가 무엇인지 잘 모르고, 하루가 걸렸을 때 내 머리 위로 심각한 WTF 버블을 올리는 데 하루가 걸렸습니다. 내가 아는 것은 사건을 처리하도록 설계된 특수 코드로 작동합니다.
예상 값에 대해 :
INT는 최대에서 2147483647 만 보유 할 수 있으므로 오버플로 수율 값 0을 폐기 할 것으로 예상됩니다.
내가 이것에 대해 전혀 배웠다면 아마도 모호한 방법에 대한 문서화의 중요성 일 것입니다.
해결책
나는 이것이 것이라고 믿는다 뿐 이 예외를 얻을 경우. 그것은 내에서 유일한 부서입니다 Int32
오버플로 할 수있는 범위. (물론 제로의 구분이 있지만 다른 예외입니다.)
따라서 피하고 싶다면 OverflowException
너 뿐 이 사건을 처리해야합니다. 당신은 그것이 무엇을 원하십니까? 이것을 발견하는 방법을 작성하십시오 정확한 사례 및 그렇지 않으면 정상 분할이됩니다.
참고 : 이것이 결과를 부정하여 비교를 되돌리려 고해서는 안된 이유입니다. 오름차순 대신 내림차순으로 무언가를 정렬하려면 사용하는 대신 -Compare(x, y)
사용 Compare(y, x)
. 부정 그렇지 않습니다 오버플로를 제공하십시오 int.MinValue
(확인 된 컨텍스트에 있지 않는 한) - 그것은 단지 조용히 돌아옵니다. int.MinValue
.
다른 팁
두 가지 보완은 정수의 범위가 2^32-1 ~ -2^32이므로 -2147483648 / -1은 int
.
당신은 그것을 a에 넣을 수 있습니다 long
. a를 사용할 이유가 없습니다 var
이러한 상황에서.
당신은 약간의 캐스팅으로 이것을 해결할 수 있습니다. Int64
:
var x = (int)((long)i / j);
당신은 이것을합니다. 왜 사용하겠습니까? var
여기? 1 캐릭터를 저장하기위한 산술 결과의 유형을 보여줄 수있는 능력을 잃어 버립니다 ...
long x = (long)i / j;
채도를 원한다면 다음을 수행 할 수 있습니다.
int x = (int)Math.Min((long)i / j, int.MaxValue);