2009-11-05 47 views
0
size = (size_in_bytes + sizeof(int) - 1)/sizeof(int); 

這是一個比真正的編程問題更多的數學問題... 這是因爲C總是向下滾動嗎?爲什麼下面的公式總是四捨五入?

+2

喬納森,如果你認爲有一個騙局添加評論,不要編輯OP的帖子。通過添加類似的內容來改變OP的意圖是不禮貌的,如果它實際上是關閉的,它會自動添加。 – bdonlan 2009-11-05 07:21:14

+0

(@bdonlan - 我同意你的看法,但是喬納森的權利 - 這是一個騙局,但原來有很多化妝品。) – 2009-11-05 07:22:14

+0

託尼小馬的答案被原先接受,然後不被接受。 – 2009-11-05 07:24:24

回答

6

整數除法在C中截斷,是的。 (即它趨向於零,而不是圓整)。

通過添加「除數-1」,確保任何不是除數的精確倍數的數字都被取整。因此,例如,除以3:

(0 + 2)/3 == 0 (0 is an exact multiple) 
(1 + 2)/3 == 1 (round up) 
(2 + 2)/3 == 1 (round up) 
(3 + 2)/3 == 2 (3 is an exact multple) 

+0

round朝0意味着.5或更大=> round up 0 to .49999999 round down? – user133466 2009-11-05 07:17:00

+1

round朝0意味着[0,1]變爲0。例如,19/5 == 3.它根本不使用中點舍入 – 2009-11-05 07:19:22

+0

向零舍入意味着負數舍入** **:'-1/2 = 0'(不是'-1') – 2011-02-01 14:55:38

1

如果size_in_bytessizeof(int)的整數倍,如2 * sizeof(int),由於(sizeof(int)-1)/ sizeof(int)小於1,因此它會給出這個倍數。如果size_in_bytes不是sizeof(int)的整數倍數,則除以sizeof(int)的餘數必須至少爲1。所以(sizeof(int) +餘數 - 一)總是> = sizeof(int)。所以它總是四捨五入。

+0

哦,不,我沒有意識到它回答了一個metashockwave問題。 – 2009-11-05 07:11:22

+0

@基諾 - 我明白你的失望,但這可能有點意思。如果你對此感到困擾,可能是Meta上的一篇文章。 – 2009-11-05 07:14:47

+0

說真的,我發佈了這個答案,但沒有注意到誰問過這個問題。否則我不會回答它。 – 2009-11-05 07:18:26

1

當所有參數都INT,/運算符確實整數除法。這意味着它會將底部劃分爲底部,就像人們所期望的那樣,但它只會拋棄剩下的部分。或者換句話說,它總是趨於零。

使用整數除法,(sizeof(int) - 1)/sizeof(int)將始終小於1。從本質上講,它是你可以擁有的最大不完全的價值。因此,將它加入等式中總是會給最終答案增加一個「不完全」的數字,當向下舍入時,它與將原始方程向上舍入相同。

回答這個問題,我意識到它使我在腦海中比在言語中更有意義。

+0

一個迂腐的挑剔:在C89/90整數除法舍入爲0或負無窮(執行定義行爲)。 C++ 98是相同的(增加了向0回合的建議)。在所有情況下,只有C99強制四捨五入。 – AnT 2009-11-05 08:08:45