Math 为什么模数是用编程语言定义的 我不是在问定义,而是为什么语言创造者选择用C++中的非对称行为定义模数。(我也认为是Java)

Math 为什么模数是用编程语言定义的 我不是在问定义,而是为什么语言创造者选择用C++中的非对称行为定义模数。(我也认为是Java),math,language-agnostic,language-design,modulus,Math,Language Agnostic,Language Design,Modulus,假设我想找到一个大于或等于n的最小数,它可以被f整除 如果n为正,则我会: if(n % f) ans = n + f - n % f; 如果n为负: ans = n - n % f; 显然,这个定义在处理负数和正数时并不是最合适的。那么,为什么会这样定义呢?在什么情况下,它会产生便利性?因为它使用“模2算法”,其中每个二进制数字都被独立地处理。看看“除法”的例子,你错了。当代码> n>代码>为负时,C++允许模算子的结果为负或正,只要从 % >和 > /的结果是一致的,那么对于任何给

假设我想找到一个大于或等于n的最小数,它可以被f整除

如果n为正,则我会:

if(n % f)
   ans = n + f - n % f;
如果n为负:

ans = n - n % f;

显然,这个定义在处理负数和正数时并不是最合适的。那么,为什么会这样定义呢?在什么情况下,它会产生便利性?

因为它使用“模2算法”,其中每个二进制数字都被独立地处理。看看“除法”的例子,你错了。当代码> n>代码>为负时,C++允许模算子的结果为负或正,只要从<代码> % >和<> > /<代码>的结果是一致的,那么对于任何给定的<代码> < < /代码>和<代码> b>代码>,表达式<代码>(A/B)*B+一% B总是产生<代码> A<代码>。C99要求
a%b
的结果具有与
a
相同的符号。其他一些语言(例如Python)要求
a%b
的符号与
b
的符号相同


这意味着C++中不需要为否定代码< N>代码>给出表达式。当/如果

n%f
产生一个正数(即使
n
是负数),它将给出小于
n
ans
,你是在问为什么模对负操作数没有固定的定义吗?澄清一下:我是在问为什么定义相对于第一个操作数的奇偶性是不对称的。
(a/b)*b+a%b
总是产生
a
,除非
b
为零,则行为未定义。“当n为负,…”更好的是,结果是在C++ 03中定义的实现,如果分红或除数是负的,但是大多数C++编译器遵循C99约定;这允许供应商使用C和C++代码的相同的机器。C++ 11遵循C99约定。它不再是实现定义。@戴维:我考虑指出Opor。消极导致了实现定义的结果——但由于他特别谈到了消极,他决定最好只讨论这一点。就相似性而言,C99更像是追随者而不是领导者——也就是说,他们对其进行了标准化,因为基本上所有现代硬件都是这样工作的。微软就是其中之一例如,似乎使用了x86
div
指令生成的内容,并且对C99的一致性没有明显的兴趣。我想知道标准强制的行为比“如果整数除法或模运算符的任一操作数为负,则结果应为未指定”更有用的频率?这样的规范将加速在缺少有符号除法指令的处理器上的实现[在嵌入式系统中很常见].我想在精确性并不重要的情况下,指定商与除法定义的有理数之间的距离小于一个单位可能比将除法作为无符号除法要好,但我希望有一种好方法……要求适当的模并舍入到负除法运算。但事实并非如此。计算CRC时使用模-2算法,而不是模运算符。