这似乎是处理 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。
我真诚地感谢任何帮助。
这里您需要余数的数学定义。
给定两个整数m, d,我们说r is the 余的划分m and d if r满足两个条件:
- 存在另一个整数k这样
m == k * d + r
, and
-
0 <= r < d
.
对于正数,在 C 中,我们有m % d == r
and m / 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 中,余数始终具有第一个操作数的符号。
+-----------------------+
| m | d | / | % |
+-----+-----+-----+-----+
| 4 | 3 | 1 | 1 |
+-----+-----+-----+-----+
| -4 | 3 | -1 | -1 |
+-----+-----+-----+-----+
| 4 | -3 | -1 | 1 |
+-----+-----+-----+-----+
| -4 | -3 | 1 | -1 |
+-----------------------+
备注:此描述(反面情况)仅适用于标准 C99/C11。您必须小心您的编译器版本,并进行一些测试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)