【问题标题】:The mod of negative numbers in C [duplicate]C中负数的模[重复]
【发布时间】:2014-03-26 08:59:53
【问题描述】:

在 C 中以下代码 ...

#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#include<stdlib.h>

int main() {
   int result = (-12) % (10);
   printf("-12 mod 10 = %d\n",result);
   return 0;
}

给出这个输出

> gcc modTest.c
> ./a.out
-12 mod 10 = -2

但根据this mod calculator -12 mod 10 = 8

在 Python 中 ...

> python
Python 3.3.0 (default, Mar 26 2013, 09:56:30)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-52)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> (-12) % (10)
8

在 C 中发生了什么会产生 -2 而不是 8?

【问题讨论】:

  • 嗯,它们是相同的模 10,不是吗。
  • 与此重复的问题没有可接受的答案!

标签: c modulus negative-number


【解决方案1】:

C11 标准说:

6.5.5:6 整数相除时,/ 运算符的结果是去掉任何小数部分的代数商。(105) 如果商 a/b 是可表示的,则表达式 (a/b)*b + a%b 应等于 a;否则,a/b 和 a%b 的行为都是未定义的。

带脚注 105:

105) 这通常被称为“向零截断”。

定义除法的另一种方法是向 -oo 舍入。这称为欧几里得除法。根据 user3307862 的link,Python 似乎使用了另一种定义。

% 运算符,正确地称为“余数”,是针对相应除法定义的,因此它要么总是在 [0..b) 中,要么在 (-b..b) 中,具体取决于/.

【讨论】:

    【解决方案2】:

    C 正在做正确的数学运算。您可以在常规计算器上查看。

    这里解释了 Python 的行为:

    negative numbers modulo in python

    【讨论】:

    • 数学家通常更喜欢欧几里得除法,并且不会称 C 中定义的“正确”除法,这对他们来说就像 Python 中的定义一样古怪。
    • 我很久以前学过的“模运算”只是将x%y 定义为x/y 之后的余数。 -12/10 给我 -1 作为商和 -2 作为余数。那么C(以及扩展的计算机硬件整数除法)哪里出错了?我可以理解 8的结果,但我会期望 -2。
    • 没有人“出错”。定义商q和余数r的方法很简单,这样除法n/d满足n = d*q + r,不同的语言选择实现不同的定义。
    【解决方案3】:

    modulo 10 中,-2 等价于8。它们只是同一事物的两种不同表示。

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2020-09-28
      • 2019-04-14
      • 2018-04-20
      • 1970-01-01
      相关资源
      最近更新 更多