size = (size_in_bytes + sizeof(int) - 1)/sizeof(int);
這是一個比真正的編程問題更多的數學問題... 這是因爲C總是向下滾動嗎?爲什麼下面的公式總是四捨五入?
size = (size_in_bytes + sizeof(int) - 1)/sizeof(int);
這是一個比真正的編程問題更多的數學問題... 這是因爲C總是向下滾動嗎?爲什麼下面的公式總是四捨五入?
整數除法在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)
等
round朝0意味着.5或更大=> round up 0 to .49999999 round down? – user133466 2009-11-05 07:17:00
round朝0意味着[0,1]變爲0。例如,19/5 == 3.它根本不使用中點舍入 – 2009-11-05 07:19:22
向零舍入意味着負數舍入** **:'-1/2 = 0'(不是'-1') – 2011-02-01 14:55:38
如果size_in_bytes
是sizeof(int)
的整數倍,如2 * sizeof(int)
,由於(sizeof(int)-1)/ sizeof(int)小於1,因此它會給出這個倍數。如果size_in_bytes
不是sizeof(int)
的整數倍數,則除以sizeof(int)
的餘數必須至少爲1。所以(sizeof(int)
+餘數 - 一)總是> = sizeof(int)。所以它總是四捨五入。
哦,不,我沒有意識到它回答了一個metashockwave問題。 – 2009-11-05 07:11:22
@基諾 - 我明白你的失望,但這可能有點意思。如果你對此感到困擾,可能是Meta上的一篇文章。 – 2009-11-05 07:14:47
說真的,我發佈了這個答案,但沒有注意到誰問過這個問題。否則我不會回答它。 – 2009-11-05 07:18:26
當所有參數都INT,/運算符確實整數除法。這意味着它會將底部劃分爲底部,就像人們所期望的那樣,但它只會拋棄剩下的部分。或者換句話說,它總是趨於零。
使用整數除法,(sizeof(int) - 1)/sizeof(int)
將始終小於1。從本質上講,它是你可以擁有的最大不完全的價值。因此,將它加入等式中總是會給最終答案增加一個「不完全」的數字,當向下舍入時,它與將原始方程向上舍入相同。
回答這個問題,我意識到它使我在腦海中比在言語中更有意義。
一個迂腐的挑剔:在C89/90整數除法舍入爲0或負無窮(執行定義行爲)。 C++ 98是相同的(增加了向0回合的建議)。在所有情況下,只有C99強制四捨五入。 – AnT 2009-11-05 08:08:45
喬納森,如果你認爲有一個騙局添加評論,不要編輯OP的帖子。通過添加類似的內容來改變OP的意圖是不禮貌的,如果它實際上是關閉的,它會自動添加。 – bdonlan 2009-11-05 07:21:14
(@bdonlan - 我同意你的看法,但是喬納森的權利 - 這是一個騙局,但原來有很多化妝品。) – 2009-11-05 07:22:14
託尼小馬的答案被原先接受,然後不被接受。 – 2009-11-05 07:24:24