我发现相同的mod操作会产生不同的结果,具体取决于使用的语言.
在Python中:
-1 % 10
Run Code Online (Sandbox Code Playgroud)
产生9
在C中它产生-1!
今天上班时我与我的一位同事进行了一次有趣的讨论.当他遇到以下情况时,他感到很惊讶:
assert(-1 % 10 == -1) //Expecting 9
Run Code Online (Sandbox Code Playgroud)
因此,当他来问我这件事,我告诉他,"好了,这是有道理的.当你把-1 10,你跟-1剩余得到0.然而,他的论点是,模运算应该秉承"总是积极的"模型.我做了一点研究,发现他所指的模数看起来像这样:
设q是a和n的整数商.设r为余数.然后:
a = n*q + r
然而,我使用的定义似乎是模数的Knuth版本,它是:
设q是除以n的底数.设r为余数.然后:
r = a - n*q
所以,我的问题是为什么它最终在FORTRAN标准(以及随后的C标准)中使模数运算符截断为0?把它称为"模数"而不是"余数"似乎是一种误称(在数学中,答案应该是9).这与硬件如何进行划分有关吗?
以供参考:
TLDR; 硬件是模数运算符向0截断的原因吗?