Модуль с отрицательным числом - PullRequest
1 голос
/ 10 января 2011

Возможные дубликаты:
Работа модуля с отрицательными значениями - странная вещь ??
Мод с отрицательным числом растапливает мой мозг!

Я попытался сделать 25 % -9 просто для удовольствия, и я получил ответ -2 (это было в Google), и когда я сделал это в коде C, я получил 7. Может кто-нибудь объяснить мне, почему два разных ответа?

Ответы [ 2 ]

7 голосов
/ 29 августа 2014

В C89 / 90 любой результат был разрешен.Результаты, полученные от деления и остатка, должны были «соответствовать» друг другу, чтобы (a/b)*b + a%b == a.

Начиная с C99, целочисленное деление с отрицательным входом требовалось для усечения до нуля.Отношение между результатами от деления и остатка все еще требуется.Это означает, что (в действительности) результат от операции остатка всегда имеет тот же знак, что и левый операнд, поэтому 25% -9 должно давать 7, а не -2. ​​

Для чего это стоит, С ++ следовал примернотот же путь, всего несколько лет спустя после C. C ++ 98/03 имеет те же правила, что и C89 / 90, поэтому для ваших входных данных остаток может быть либо отрицательным, либо положительным (но все равно должен соответствовать результату деления).Начиная с C ++ 11, он требует того же поведения, что и C99, поэтому 25% - 9 == 7.

Некоторые другие языки (например, Python) требуют, чтобы результат от остатка имел тот же знак, что ивместо этого правый операнд.

2 голосов
/ 10 января 2011

Если подумать об этом в математической базе 9, то это то же самое, что 9-2 = 7

...