【问题标题】:Modulus with a negative number带负数的模数
【发布时间】:2011-01-10 10:39:41
【问题描述】:

可能的重复:
Modulus operation with negatives values - weird thing ??
Mod of negative number is melting my brain!

我尝试 25 % -9 只是为了好玩,我得到的答案是 -2(这是在 Google 上),当我用 C 代码执行此操作时,我得到了 7。有人能解释一下为什么会有两个不同的答案吗?

【问题讨论】:

    标签: c math


    【解决方案1】:

    在 C89/90 中,任一结果都是允许的。您从除法和余数得到的结果需要“拟合”在一起,以便(a/b)*b + a%b == a

    从 C99 开始,需要使用负输入进行整数除法才能截断为零。但是,除法结果和余数之间的关系仍然是必需的。这意味着(实际上)余数运算的结果始终与左操作数具有相同的符号,因此 25 % -9 必须产生 7,而不是 -2。

    不管怎样,C++ 走的是大致相同的道路,仅比 C 落后几年。C++98/03 与 C89/90 具有相同的规则,因此对于您的输入,余数可能是负数或正数(但仍需要与除法的结果相吻合)。从 C++11 开始,它需要与 C99 相同的行为,因此 25 % - 9 == 7。

    其他一些语言(例如 Python)要求余数的结果与右操作数的符号相同。

    【讨论】:

    • 赞成,因为它是全面而正确的答案,在 SO 上很少见。我唯一想念的是讨论不同规则的基本原理。 Python 的规则意味着它很容易例如计算一组 10 人需要多少载客量为 3 的出租车,而 C 和 C++ 规则意味着计算在当代硬件上效率最高。然后,有一个问题,为什么硬件是这样的。我不知道。 :-)
    • @Cheersandhth.-Alf:是的,我有点担心试图给出理由,尤其是对于 C 语言中的东西(如你所知)有时可以归结为:“因为它允许PDP/7 在它的中端、定点、36 位算术中保存 3 个门,或者其他同样晦涩的东西。
    【解决方案2】:

    如果你以 9 为基数来考虑它,它们与 9-2 = 7 是一回事

    【讨论】:

    • @Rafid:我怀疑他的意思是“模 9”等价类。但是,是的,奇怪的措辞。
    猜你喜欢
    • 2012-08-29
    • 2013-10-16
    • 2013-04-11
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2017-01-13
    相关资源
    最近更新 更多