为什么模数定义为编程语言中的模式

时间:2011-09-17 01:00:30

标签: math language-agnostic language-design modulus

我不是在询问定义,而是为什么语言创建者选择在C ++中定义具有不对称行为的模数。 (我也认为Java)

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

如果n是正数,那么我会这样做:

if(n % f)
   ans = n + f - n % f;

如果n为负数:

ans = n - n % f;

显然,在处理负数和正数时,这个定义并不是最有利的。那为什么这样定义呢?在什么情况下会产生权宜之计?

2 个答案:

答案 0 :(得分:1)

因为它使用“模2算术”,其中每个二进制数字被独立地处理。看看“师”here

上的例子

答案 1 :(得分:1)

你错了。当n为负数时,只要%/的结果一致,C ++就允许模数运算符的结果为负数或正数,因此对于任何给定的{{1} }和a,表达式b将始终产生(a/b)*b + a%b。 C99要求a的结果与a % b的结果相同。其他一些语言(例如Python)要求a的符号与a % b具有相同的符号。

这意味着您为负b提供的表达式实际上并不需要在C ++中工作。当/ n产生正数时(即使n%f为负数),它会使n小于ans