Из второго издания K & R (около 1988 г.)
Бинарный оператор /
дает частное, а оператор %
остаток от деления первого операнда на второй; если
второй операнд равен 0, результат не определен, в противном случае он всегда
правда, что (a/b)*b + a%b
равно a
. Если оба операнда
неотрицательный, то остаток неотрицательный и меньше, чем
делитель; если нет, то гарантируется только то, что абсолютное значение
остаток меньше абсолютного значения делителя.
Например, для вычисления -8/-5
(по правилам C89) нам сначала нужно вычислить -8%-5
. Спецификация допускает два возможных ответа для остатка: -3
и 2
. Оба удовлетворяют требованию, что абсолютное значение остатка меньше, чем абсолютное значение делителя, и оба удовлетворяют требованию, что (a/b)*b + a%b
равно a
.
(-8/-5)*-5 + -3 = -8 ==> (-8/-5) = 1 since (1)*-5 + -3 = -8
(-8/-5)*-5 + 2 = -8 ==> (-8/-5) = 2 since (2)*-5 + 2 = -8
Таким образом, результат деления позволил (C89) иметь два разных ответа, потому что (при условии отрицательного a
или b
) результат оператора остатка %
может быть либо отрицательным, либо положительным. Это было исправлено в C99, которое требует деления для усечения до 0.
Для тех, кто склонен к математике, обратите внимание, что
-3 ≣ 2 mod(5)
https://en.wikipedia.org/wiki/Congruence_relation