2010-08-30 31 views
135

例如,整數除法的行爲是什麼?

int result; 

result = 125/100; 

result = 43/100; 

會導致永遠是分工的地板?什麼是定義的行爲?

+0

摘要:*** signed *整數除法截斷爲零**。對於非負面結果,這與樓層相同(朝向-Infinity)。 (請注意,C89不保證這一點,請參閱答案。) – 2017-11-07 04:19:44

回答

135

結果總是會是師的底線?什麼是定義的行爲?

是,兩個操作數的整數商。

6.5.5乘法運算符

當整數分割,/運算的結果是代數商與丟棄任何 小數部分。 88)如果商a/b可表示,則表達式 (a/b)* b + a%b應等於a。

和相應的腳註:

88)這通常被稱爲「'截斷向零」。

當然兩點要注意的是:

通常的算術轉換都對操作數執行。

和:

/運算的結果是由第二所述 第一個操作數的除法的商 ; %運算符的 結果是餘下的 。 在這兩種操作中,如果第二個操作數的值爲 爲零,則該行爲未定義。

[注:重點煤礦]

+11

...除非你將一個負數除以正值(或v.v.),在這種情況下,它將成爲最大值。 – 2010-08-30 17:45:19

+53

既不是地板也不是天花板,它是小數部分的截斷,它在概念上是不同的! – Wizard79 2010-08-30 17:48:33

+25

@將A:不是。它被定義爲朝零截斷。調用其他任何東西只會增加混淆,所以請不要這樣做。 – 2010-08-30 17:49:10

11

是的,結果總是被截斷爲零。它會向最小的絕對值圓整。

-5/2 = -2 
5/2 = 2 

對於無符號和非負符號值,這與floor(向-Infinity舍入)相同。

+38

截斷,* not * floor。 – dan04 2010-08-30 17:44:51

+7

@ dan04:yep樓層只對正整數有效:) – Leonid 2010-08-30 17:46:31

15

如果結果爲負,C向0截斷,而不是地板 - 我瞭解到這個閱讀爲什麼Python的整數除法總是樓層位置:Why Python's Integer Division Floors

+2

我同意評論是否有(neg%pos)消極有用嗎?在相關說明中,我想知道在「unsignedvar> signedvar」的某些情況下所需的算術錯誤行爲是否有用?我能理解不需要永遠正確行爲的理由;我沒有看到要求錯誤行爲的理由。 – supercat 2010-08-30 18:34:33

+6

+1爲什麼地板是整數除法的正確行爲的一個很好的參考(與C的定義相反,它被打破並且幾乎沒有用)。 – 2010-08-30 19:19:28

+0

正確和準確。 +1。 – 2015-02-06 09:04:34

33

Dirkgently在C99中給出了整數除法的an excellent description,但是您還應該知道,在C89整數除法中,負操作數具有實現定義的方向。

從ANSI C草案(3.3.5):

如果操作數是負的,/操作的結果是否大於代數商或最小整數比小於的最大整數更大的代數商是實現定義的,這是%運算符結果的符號。如果商a/b可表示,則表達式(a/b)* b + a%b應等於a。

因此,當您使用C89編譯器時,請注意負數。

C99選擇向零截斷是一個有趣的事實,因爲這是FORTRAN如何做到的。請參閱comp.std.c上的this message

+0

和C99草案N1256前言第5段提到'可靠的整數除法'作爲一種新的語言特徵。令人驚歎的'* - *'。 – 2016-09-11 08:24:51

+0

截斷是最常見的CPU硬件(例如x86)的行爲,所以做出不同的選擇會是瘋狂的。 IDK首先是Fortran語義或硬件行爲,但這些並不是巧合。 – 2017-11-07 04:23:35

10

結果會一直是師的底線嗎?

不會,結果會有所不同,但變化只發生在負值上。

什麼是定義的行爲?

要清楚地板輪朝負無窮大,而整數除法舍入到零(截斷)

對於正值它們是相同的

int integerDivisionResultPositive= 125/100;//= 1 
double flooringResultPositive= floor(125.0/100.0);//=1.0 

對於負值,這是不同

int integerDivisionResultNegative= -125/100;//=-1 
double flooringResultNegative= floor(-125.0/100.0);//=-2.0 
相關問題