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