Ответ 1
В дополнение к Luchian ответ, это соответствующая часть из стандарта С++ 11:
Двоичный/оператор дает частное, а двоичный оператор% дает остаток от деления первого выражения на второй. Если второй операнд/или% равен нулю, поведение undefined. Для интегральных операндов оператор/дает алгебраическую частное с какой-либо дробной частью, отброшенной; если фактор a/b является представимый в типе результата, (a/b) * b + a% b равен a.
Что пропускает последнее предложение. Итак, часть
(a/b) * b + a% b равно a
Является единственной ссылкой, на которую можно положиться, и это означает, что a % b
всегда будет иметь знак a
, учитывая поведение усечения /
. Поэтому, если ваша реализация соответствует стандарту С++ 11 в этом отношении, знак и значение операции modulo действительно отлично определены для отрицательных операндов.