Ответ 1
ответ на wikipedia здесь весьма полезен.
Краткий обзор состоит в том, что любое целое число можно определить как
a = qn + r
где все эти буквы являются целыми числами, а
0 <= | r | < | П |.
Для почти каждого языка программирования потребуется (a/n) * n + (a% n) = a. Поэтому определение модуля почти всегда будет зависеть от определения целочисленного деления. Существует два варианта для целочисленного деления на отрицательные числа 2/-18 = 0 или 2/-18 = -1. В зависимости от того, какой из них подходит для вашего языка, обычно изменяется оператор%.
Это связано с тем, что 2 = (-1) * -18 + (-16) и 2 = 0 * -18 + 2.
Для Perl ситуация сложная. На странице руководства говорится: "Обратите внимание, что когда use integer находится в области видимости," % "дает вам прямой доступ к оператору модуля, реализованному вашим C компилятор. Этот оператор не так хорошо определен для отрицательных операндов, но он будет выполняться быстрее". Таким образом, он может выбрать любой вариант для Perl (например, C), если использовать integer в области видимости. Если целое число используется не в объеме, в руководстве говорится: "Если значение $b отрицательно, то $a% $b равно $a минус наименьший кратный $b, который не меньше $a (т.е. результат будет меньше или равен равным нулю).