3

这似乎是在处理 Remainder/Mod 时被问到的第一件事,我有点碰壁了。我正在教自己用一本教科书和一小段 C 代码来编程。

看到我真的没有教练说,“不,不。它实际上是这样工作的”,我想我会在这里尝试一下。不过,我还没有找到数学部分的结论性答案。

所以......我的印象是这是一个非常罕见的情况,但我仍然想知道在闪亮的编译下发生了什么。另外,这本教科书希望我根据 C89 标准提供使用负余数时可能出现的所有值。问一下是否有人可以检查这个数学是否合理?

1) 9%4
9 - (2) * 4 = 1     //this is a value based on x - (x/y) * y
(2) * 4 + (1) = 9     //this is a check based on (x/y) * y + (x%y) = x

2) -9%4
9 - (2) * 4 = 1; 9 - (3) * 4 = -3   //these are the possible values
(2) * 4 + (1) = 9; (3) * 4 + (-3) = 9    //these are the checks

3) 9%-4
Same values as #2?? 

我尝试在表达式中使用负数进行计算,并得出了 17 和 -33 等荒谬的东西。#3 也是 1 和 -3 吗?

4) -9%-4
Same as #1??

在代数除法中,负号“取消”。他们在这里做同样的事情,还是发生了其他事情?

我认为最让我困惑的是负面因素。我在学校(5-6 年前)学习代数的方式是“依附”于他们的数字。在编程中,由于它们是一元运算符,不是这样吗?示例:在 #2 上填写 x 的值时,x = 9 而不是 x = -9。

我真诚地感谢任何帮助。

4

2 回答 2

4

在这里,您需要关于余数的数学定义。

给定两个整数m, d ,如果r满足两个条件 ,我们说rmd相除的余数:

  • 存在另一个整数k使得m == k * d + r, 和
  • 0 <= r < d.

对于正数,在 C 中,我们有m % d == rm / d == k,只要遵循上面的定义。

由定义可得 3 % 2 == 1 和 3 / 2 == 1。
其他例子:

4 / 3 == 1 和 5 / 3 == 1,尽管 5.0/3.0 == 1.6666(四舍五入为 2.0)。

4% 3 == 1 和 5% 3 == 2。

您也可以相信公式r = m - k * d,它在 C 中写成:

m % d == m - (m / d) * d

但是,在标准 C 中,整数除法遵循以下规则:round to 0.
因此,对于负操作数,C 提供了与数学结果不同的结果。
我们会有:

(-4) / 3 == -1, (-4) % 3 == -1(在 C 中),但在简单的数学中:(-4) / 3 = -2, (-4) % 3 = 2。

在简单的数学中,余数总是非负的,并且小于abs(d).
在标准 C 中,余数始终具有第一个操作数的符号。

+------------------------+
 | 米 | d | / | % |
 +-----+-----+-----+------+
 | 4 | 3 | 1 | 1 |
 +-----+-----+-----+------+
 | -4 | 3 | -1 | -1 |
 +-----+-----+-----+------+
 | 4 | -3 | -1 | 1 |
 +-----+-----+-----+------+
 | -4 | -3 | 1 | -1 |
 +------------------------+

备注:此描述(在否定情况下)仅适用于标准 C99/C11。你必须小心你的编译器版本,并做一些测试。

于 2013-09-14T08:07:00.067 回答
1

就像 Barmar 的链接答案所说的数学意义上的模数意味着数字是环的同一类(我的代数理论有点生疏,所以抱歉这些术语可能有点松散使用:))。

所以模数 5 意味着您有一个大小为 5 的环。即 0、1、2、3、4 当您将 1 加到 4 时,您又回到了零。所以 -9,-4,1,6,11,16 都是相同的模 5,因为它们都是等价的。这实际上对于各种代数定理非常重要,但对于普通程序员来说几乎没用。

基本上标准是未指定的,因此为负数返回的模数必须是那些等效的数字类别之一。这不是余数。如果你想要基本的整数除法,在这种情况下你最好的选择是在做模运算符时对绝对值进行运算。如果您使用更高级的技术(如公钥加密),您可能需要多复习一下您的数学知识。

现在我会说在这种情况下仍然使用正整数,并享受有趣的编程有趣的东西。

于 2013-09-14T05:11:44.743 回答