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