2009-11-05 48 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