2014-09-21 151 views
3

以下是Mike Banahan的C书的摘录& Brady (Link: Section 2.8.2.1)。像我这样的人没有理由怀疑作者是错的,除非你有别人的建议。对于非零'b',表达式“(a/b)* b + a%b - a”的表达式总是为零吗?

请告诉我地球人怎么样“(a/b)* b + a%b - a”对于b不为零的整数总是零。

提取的文本如下:

如果操作数是负的,的/可就近 整数两边的真实结果,和的% 可以是正的结果的符号的结果或否定的。这两个功能都是定义的 实现。

它始终是真的,以下表达式是等于零:

(a/b)*b + a%b - a 

除非b为0。

通常的算术转换应用于两个操作数。

+0

作为一个说明,它是在C89实现定义的。自C99以来,划分被定义为向0舍入(并且给定的等式仍然成立)。 – mafso 2014-09-21 17:18:13

回答

4

这是真实的由操作者%的定义中C.

在C标准的余数运算符的定义表示:

(C11,6.5.5p6)“如果商a/b可表示,表达式(a/b)* b + a%b应等于a;“

还要注意,对于这两种/%,如果第二个操作数是0该标准规定了操作是未定义的行为。

+0

Hmmnn ....回答它....所有的肉..我试图咀嚼...它将需要一段时间消化.. +1。 – Thokchom 2014-09-21 15:01:55

+2

我从来没有想过这个例子可能是标准的:O – haccks 2014-09-21 15:21:03

+0

@haccks等一下......我是不是在我的问题中无意中提到了标准中的表达式? :-) – Thokchom 2014-09-21 15:25:18

4

数学...

在纸面上,(A/B)* B == A(B取消),这就是为什么结果看起来很滑稽。

但是,计算机首先计算(a/b),然后乘以b。如果这是在整数算术中完成的,则在乘法之前a/b可能被舍入。

如果< b,则A/B的结果为0,并且a%b是,给予0 + A - A == 0

如果A> B,则(A/B) * b == floor(a/b)和(a/b)* b + a%b == a,再次给出0.

本质上这是测试编译器是否正确执行整数运算

+1

+1。是的,一个数学解释会给它更多的启示。 – Thokchom 2014-09-21 15:26:07

+0

有时会遇到'a == INT_MIN'和'b == -1'的问题。 – chux 2014-09-22 04:32:29

2

如果num1/num2给出商q和余数r,则
然后num1 = q*num2 + r

这里以num1anum2b, ,则a/b为商部分,余数部分为a%b

a=(a/b)*b+(a%b)所以和(A/B)* B +(A%B)-a等于

相关问题