2014-09-21 73 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等於

相關問題