Подтвердить что ты не робот

Оператор С++% гарантирует

Гарантируется ли, что (-x) % m, где x и m являются положительными в С++ Стандартная (С++ 0x) отрицательна и равна -(x % m)?

Я знаю это на всех машинах, которые я знаю.

4b9b3361

Ответ 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. Если оба операнда неотрицательны, а остальные неотрицательны; если нет, знак остатка определяется реализацией (акцент мой)

Это из С++ 03.: (