带负数的模数

可能重复:
带负值的模数运算 – 怪异的事情?
负数的Mod正在融化我的大脑!

我尝试做25 % -9只是为了好玩而我得到的答案是-2(这是在谷歌上)当我用C代码做到这一点时我得到7.有人能解释我为什么有两个不同的答案吗?

在C89 / 90中,两种结果都是允许的。 你从除法和余数得到的结果需要“拟合”在一起,以便(a/b)*b + a%b == a

从C99开始,需要使用负输入的整数除法向零截断。 尽管如此,仍需要除法和余数之间的关系。 这意味着(实际上)余数运算的结果总是与左操作数具有相同的符号,因此25%-9必须产生7而不是-2。

对于它的价值,C ++遵循大致相同的路径,仅落后C几年.C ++ 98/03具有与C89 / 90相同的规则,因此对于您的输入,其余部分可能是负数或正数(但仍需要与分裂的结果相配合)。 从C ++ 11开始,它需要与C99相同的行为,因此25% – 9 == 7。

其他一些语言(例如,Python)要求其余部分的结果与右操作数的符号相同。

如果你在9的数学基础上考虑它,它们与9-2 = 7相同