정수 부서에서 오버 플로 엑스크가 던져지는 것을 어떻게 멈출 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1300777

문제

나는 얻고있다 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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top