了解CEILING宏用例

tde*_*ton 5 c macros ceil

我在代码库的实用程序头中找到了以下宏:

#define CEILING(x,y) (((x) + (y) - 1) / (y))
Run Code Online (Sandbox Code Playgroud)

哪个(在这个答案的帮助下)我解析为:

// Return the smallest multiple N of y such that:
//   x <= y * N
Run Code Online (Sandbox Code Playgroud)

但是,无论我多么盯着我们的代码库中如何使用这个宏,我都无法理解这种操作的价值.没有任何用法被评论,这似乎表明它是显而易见的.

任何人都可以为这个宏提供用例的英文解释吗?它可能很明显,我只是看不到它......

Dou*_*rie 5

假设你想以块的形式分配内存(想想:缓存行,磁盘扇区); 保存包含X字节的整数块的内存需要多少内存?如果卡盘尺寸是Y,那么答案是:CEILING(X,Y)


unk*_*ulu 5

当您在C中使用整数除法时

y = a / b
Run Code Online (Sandbox Code Playgroud)

你师四舍五入的结果趋向于零,即5 / 2 == 2,-5 / 2 == -2.有时候需要以另一种方式对它进行舍入5 / 2 == 3,例如,如果你想采用最小整数数组大小来保存n字节,你可能需要n / sizeof(int)向上舍入,因为你需要空间来保存那些额外的字节.

所以这个宏确实如此:CEILING(5,2) == 3但请注意它只适用于正面y,所以要小心.