c++ - 为什么 operator% 被称为 "modulus"运算符而不是 "remainder"运算符?

标签 c++ operators standards modulus

今天在工作中,我与一位同事进行了一次有趣的讨论。当他遇到以下事情时,他感到很惊讶:

assert(-1 % 10 == -1)  //Expecting 9

所以当他来问我这个问题时,我告诉他“嗯,这是有道理的。当你将 -1 除以 10 时,你会得到 0,剩下 -1。然而,他的论点是模运算符应该坚持“总是积极”的模型。我做了一些研究,发现他所指的模数看起来像这样:

Let q be the integer quotient of a and n. Let r be the remainder. Then:

a = n * q + r

I 使用的定义似乎是模数的 Knuth 版本,即:

Let q be the floor of a divided by n. Let r be the remainder. Then:

r = a - n * q

所以,我的问题是为什么它最终在 FORTRAN 标准(以及随后的 C 标准)中使模数运算符截断为 0?将其称为“模数”而不是“余数”对我来说似乎用词不当(在数学中,答案确实应该是 9)。这是否与硬件如何进行划分有关?

供引用:

TLDR;硬件是模运算符向 0 截断的原因吗?

最佳答案

It seems like a misnomer to me to call it "modulus" and not "remainder" (In math, the answer really should be 9).

C 将其称为 % 运算符,并将其结果称为余数。 C++ 从 C 复制了这个。两种语言都称它为模运算符。这也解释了为什么余数为负:因为/运算符向 0 截断,并且 (a/b) * b + (a % b) 应该等于 a

编辑:David Rodríguez 正确地指出 C++确实定义了一个模板类 std::modulus,它调用 operator% 。在我看来,这个类的名字很糟糕。稍微挖掘一下,它是从 STL 继承的,它已经被命名为现在的名称。 STL 的下载显示“STL 是在 SGI MIPSproTM C++ 7.0、7.1、7.2 和 7.2.1 上开发的。”据我所知,在没有编译器和硬件的情况下,MIPSpro 将除法传递给 CPU 和MIPS 硬件截断为 0,这意味着 std::modulus 一直被错误命名。

关于c++ - 为什么 operator% 被称为 "modulus"运算符而不是 "remainder"运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9284644/

相关文章:

c++ - 使用 cpp 从 mongo db 检索浮点值

c++ - 指向我的 Inventory.h 中的 vector 时出错

c++ - 我的递归函数有什么问题?

php - 如何用 PHP 编写 'n <<= 1' (Python)?

c++ - 为什么未命名的命名空间是静态的 "superior"替代品?

c - 命令行错误消息的 "POSIX-defined format"是什么?哪个标准?

html 获取多个文件

c++ - 让模板通过指定 bitesize 在 char/short/int 之间进行选择?

Java加运算符

c - 如何使用不同的运算符重用相同的 C 代码