В программе на Си я пробовал следующие операции (просто чтобы проверить поведение)
x = 5 % (-3);
y = (-5) % (3);
z = (-5) % (-3);
printf("%d ,%d ,%d", x, y, z);
дал мне вывод как (2, -2 , -2)
в gcc. Я ожидал положительного результата каждый раз. Может ли модуль быть отрицательным? Кто-нибудь может объяснить это поведение?
Ответы:
C99 требует, чтобы, когда
a/b
представимо:(a/b) * b
+a%b
должен равнятьсяa
Это логично, логично. Правильно?
Посмотрим, к чему это приведет:
Пример А.
5/(-3)
является-1
=>
(-1) * (-3)
+5%(-3)
=5
Это может произойти, только если
5%(-3)
2.Пример Б.
(-5)/3
является-1
=>
(-1) * 3
+(-5)%3
=-5
Это может произойти только тогда , когда
(-5)%3
это-2
источник
-5/3
есть-2
и мод становится 1. Короче: один модуль имеет знак, который следует за знаком дивиденда (усеченный), другой модуль имеет знак, который следует за знаком делителя (Кнут).