2015-11-25 12 views
5

W 7.8.3. z C# specyfikację dotyczącą operatora resztach stwierdza co następuje:Dlaczego wartość int.MinValue% -1 i OverflowException

Jeśli lewy operand jest najmniejsza int lub długo wartość i prawo operand jest -1, System.OverflowException jest wyrzucane.

Dlatego int.MinValue % -1 spowodowałoby wyjątek OverflowException. Próbuję zrozumieć, dlaczego?

+0

Należy zauważyć, że w Javie wynikiem jest "0" według specyfikacji, aw C operacja wywołuje niezdefiniowane zachowanie. – ouah

Odpowiedz

6

W arytmetyce uzupełnień dwójkowych typy danych mają zakres od (-2 ** n) do (2 ** n - 1) (gdzie "n" wynosi 1 mniej niż liczba bitów w typie danych).

Na przykład 16-bitowa liczba całkowita ze znakiem ma prawidłowy zakres od -32768 (-2 ** 15) do 32767 (2 ** 15-1).

-32768/-1 = +32768, który przekracza dopuszczalny zakres 16-bitowej liczby całkowitej ze znakiem.

+2

Matematycznie "int.MinValue% -1" miałoby wartość 0 lub -1 (lub możliwe 1). To nie przekracza prawidłowego zakresu dla 16-bitowej liczby całkowitej ze znakiem. – chux

+2

Ale zwykle oblicza się je najpierw dzieląc, a następnie znajdując pozostałą część. – keithmo

+0

Zgadzam się, ale czy specyfikacja języka wymaga tego zamówienia? – chux

Powiązane problemy