今天在工作中,我和我的一位同事进行了一次有趣的讨论。当他遇到以下事情时,他感到很惊讶:
assert(-1 % 10 == -1) //Expecting 9
所以当他来问我这个问题时,我告诉他“嗯,这是有道理的。当你将 -1 除以 10 时,你得到 0,剩下 -1。然而,他的论点是模运算符应该适用于“总是积极的”模型。我做了一些研究,发现他所指的模数看起来像这样:
令 q 为 a 和 n 的整数商。令 r 为余数。然后:
a = n * q + r
然而,我使用的定义似乎是模数的 Knuth 版本,即:
设 q 是 a 除以 n 的底。令 r 为余数。然后:
r = a - n * q
所以,我的问题是为什么它最终在 FORTRAN 标准(以及随后的 C 标准)中使模运算符截断为 0?将其称为“模数”而不是“余数”对我来说似乎用词不当(在数学中,答案确实应该是 9)。这与硬件如何进行划分有关吗?
以供参考:
- 关于模量的维基百科
- “模数”运算符的 MSDN 条目
(是的,我意识到它适用于 VS2003 ......我目前坚持使用它。Sadface) - 模数运算符更改
- 不要假设正余数...
TLDR;硬件是模数运算符向 0 截断的原因吗?