我不是在询问定义,而是为什么语言创建者选择在C ++中定义具有不对称行为的模数。 (我也认为Java)
假设我想找到大于或等于n的最小数,可以被f整除。
如果n是正数,那么我会这样做:
if(n % f)
ans = n + f - n % f;
如果n为负数:
ans = n - n % f;
显然,在处理负数和正数时,这个定义并不是最有利的。那为什么这样定义呢?在什么情况下会产生权宜之计?
答案 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
。