Гарантируется ли это, что (-x) % m
, где x
а также m
позитивны в с ++ стандарт (c ++ 0x) отрицательно и равно -(x % m)
?
Я знаю, что это правильно на всех машинах, которые я знаю.
В дополнение к LuchianОтвет, это соответствующая часть из стандарта C ++ 11:
Двоичный / оператор дает частное, а двоичный оператор%
дает остаток от деления первого выражения на
второй. Если второй операнд / или% равен нулю, поведение
не определено. Для интегральных операндов оператор / дает алгебраический
частное с любой дробной частью отбрасывается; если частное а / б
представляемый в типе результата, (a / b) * b + a% b равен a.
Который пропускает последнее предложение. Итак, часть
(a / b) * b + a% b равно a
Это единственная ссылка, на которую можно положиться, и это означает, что a % b
всегда будет иметь знак a
, учитывая усеченное поведение /
, Таким образом, если ваша реализация придерживается стандарта C ++ 11 в этом отношении, знак и значение операции по модулю действительно идеально определены для отрицательных операндов.
4) Бинарный / оператор дает частное, а бинарный%
Оператор дает остаток от деления первого
Выражение вторым. Если второй операнд / или% равен нулю,
поведение не определено; в противном случае (a / b) * b + a% b равно a. Если
оба операнда неотрицательны, тогда как остаток неотрицателен; если
нет, знак остатка определяется реализацией (акцент мой)
Это из C ++ 03, хотя. 🙁