2015-11-25 14 views
5

In 7.8.3. del C# specifica per quanto riguarda l'operatore resto si afferma quanto segue:Perché int.MinValue% -1 causa e OverflowException

Se l'operando a sinistra è il più piccolo int o il valore a lungo e il diritto operando è -1, uno System.OverflowException è gettato.

Pertanto int.MinValue % -1 genererebbe OverflowException. Sto cercando di capire perché?

+0

Si noti che in Java, il risultato è '0' in base alle specifiche e in C l'operazione richiama il comportamento non definito. – ouah

risposta

6

In aritmetica a complemento a due, i tipi di dati hanno un intervallo da (-2 ** n) a (2 ** n-1) (dove 'n' è 1 in meno del numero di bit nel tipo di dati).

Ad esempio, un numero intero con segno a 16 bit ha un intervallo valido da -32768 (-2 ** 15) a 32767 (2 ** 15 - 1).

-32768/-1 = +32768 che supera l'intervallo valido per un intero con segno a 16 bit.

+2

Matematicamente 'int.MinValue% -1' sarebbe 0 o -1 (o possibile 1). Questo non supera l'intervallo valido per un intero con segno a 16 bit. – chux

+2

Ma in genere viene calcolato dividendo prima, quindi trovando il resto. – keithmo

+0

Accetto, ma le specifiche della lingua richiedono quell'ordine? – chux

Problemi correlati