2011-01-10 2 views
1

Возможные Duplicates:
Modulus operation with negatives values - weird thing ??
Mod of negative number is melting my brain!Modulus с отрицательным числом

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

+2

развлечения? Наверняка нет ;-) – diagonalbatman

ответ

2

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

+0

@ Rafid: Я подозреваю, что он означает класс эквивалентности «modulo 9». Но да, странная формулировка. – Joey

7

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

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

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

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

+0

Приобретено, поскольку это всеобъемлющий и правильный ответ, редкость на SO. Единственное, что я пропустил, это обсуждение обоснований для разных правил. Правило Python означает, что это легко, например, вычислить, сколько такси с пассажирской мощностью 3 требуется для группы из 10 человек, в то время как правила C и C++ означают, что вычисления максимально эффективны для современного оборудования. Тогда возникает вопрос, почему такое аппаратное обеспечение. Я не знаю. :-) –

+0

@ Cheersandhth.-Alf: Да, я немного беспокоюсь о том, чтобы попытаться дать обоснование, особенно для вещей в C, которые (как вы уже знаете) иногда могут прийти к чему-то вроде: «потому что это позволило PDP/7 для сохранения 3-х ворот в средней, 36-разрядной арифметике с фиксированной точкой, или что-то в равной степени неясное. –

Смежные вопросы