Последний черновик C ++ 11, n3242 , который почти идентичен фактическому стандарту C ++ 11, говорит об этом в 5.6 пункт 4 (стр. 118):
Для целых операндов оператор / дает алгебраический фактор
с любой дробной частью отбрасывается; (см. примечание 80)
Примечание 80 состояний (обратите внимание, что примечания являются ненормативными):
80) Это часто называют усечением до нуля.
Для полноты, пункт 4 переходит в состояние:
если частное a / b представимо в типе результата,
(a / b) * b + a% b равно a.
, который, как можно показать, требует, чтобы знак a%b
совпадал со знаком a
(если не ноль).
Примечание. Действующий стандарт C ++ 11 юридически недоступен онлайн. Тем не менее, проекты являются. К счастью, различия между последним проектом (N3242) и фактическим стандартом невелики. См. этот ответ .
ПРИМЕЧАНИЕ : Я не уверен, какие компиляторы придерживаются стандарта C ++ 11.
То есть div_to_zero()
- обычное /
деление.
Боюсь, что для других функций вам придется проверить знаки a
и b
и отрегулировать их соответствующим образом. Иногда может потребоваться дополнительная проверка, равняется ли a%b
нулю. Таким образом, мы рассматриваем 12 тестовых случаев для каждой функции (3 для знака или нули a, 2 раза для знака b, 2 раза, равняется ли a%b
нулю или нет).
Это слишком много для меня, чтобы понять прямо сейчас, поэтому, может быть, кто-то еще прыгнет и даст правильный ответ.
Я знаю, что Я не ответил на ваш вопрос , но приведенная выше информация казалась ценной и была слишком большой, чтобы уместиться в комментарии.