2015-11-25 4 views
5

In 7.8.3. der C# Spezifikation in Bezug auf den Rest Betreiber heißt es wie folgt:Warum verursacht int.MinValue% -1 Ursache und ÜberlaufException

Wenn der linke Operand der kleinste int oder long-Wert und die rechte Operand -1 ist, wird ein System.OverflowException geworfen.

Daher würde int.MinValue % -1 zu einer OverflowException führen. Ich versuche zu verstehen, warum?

+0

Beachten Sie, dass in Java das Ergebnis nach Spezifikationen '0' lautet und in C die Operation undefiniertes Verhalten aufruft. – ouah

Antwort

6

In Zweierkomplement-Arithmetik haben Datentypen einen Bereich von (-2 ** n) bis (2 ** n - 1) (wobei 'n' 1 kleiner ist als die Anzahl der Bits im Datentyp).

Zum Beispiel hat eine 16-Bit-Ganzzahl mit Vorzeichen einen gültigen Bereich von -32768 (-2 ** 15) bis 32767 (2 ** 15 - 1).

-32768/-1 = +32768, die den gültigen Bereich für eine 16-Bit-Ganzzahl mit Vorzeichen überschreitet.

+2

Mathematisch "int.MinValue% -1" wäre 0 oder -1 (oder mögliche 1). Dies überschreitet nicht den gültigen Bereich für eine 16-Bit-Ganzzahl mit Vorzeichen. – chux

+2

Aber es wird normalerweise berechnet, indem zuerst geteilt wird und dann der Rest gefunden wird. – keithmo

+0

Stimmen Sie zu, aber verlangt die Sprachspezifikation diese Reihenfolge? – chux

Verwandte Themen