size = (size_in_bytes + sizeof(int) - 1) / sizeof(int);
这是一个比真正的编程问题更多的数学问题...... 是因为C总是向下舍入?
答案 0 :(得分:6)
整数除法在C中截断,是的。 (即它向零舍入,而不是向下舍入。)
通过添加“divisor - 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)
等
答案 1 :(得分:1)
如果size_in_bytes
是sizeof(int)
的整数倍,如2 * sizeof(int)
,它会给你那个倍数,因为(sizeof(int)-1)/ sizeof(int)小于一。如果size_in_bytes
不是sizeof(int)
的整数倍,则除以sizeof(int)
时的余数必须至少为1。所以(sizeof(int)
+那个余数 - 一个)总是> = sizeof(int)。所以它总是四舍五入。
答案 2 :(得分:1)
当所有参数都是 int 时,/运算符进行整数除法。这意味着它会将顶部划分为底部,就像人们对数学的期望一样,但它会抛弃其余部分。或者,换句话说,它将始终向零舍入。
使用整数除法,( sizeof(int) - 1 ) / sizeof(int)
将始终小于1。从本质上讲,它是您可以拥有的最大的非常重要的价值。因此,将它添加到等式中将总是在最终答案中添加不完整的答案,当向下舍入时,将与舍入原始等式相同。
回过头来看这个答案,我意识到它在我脑海里比在文字中更有意义。