3

以下代码将参数四舍五入为 int 大小边界字节数。

  #define _INTSIZE(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))

在我的机器上,int 是 4 个字节,所以——如果我错了,请纠正我——这应该与查找整数的下一个 4 的倍数(在我的机器上)相同。下一个 4 的倍数,我的意思是如果不是 4 的倍数,则该数字应向上舍入为 4 的倍数。如果已经是 4 的倍数,则应保持不变。

我一直在玩这个代码。总而言之:为什么这段代码有效?(也许不是,但似乎是。)我想有理由认为它适用于所有情况,而不仅仅是我尝试过的那些。

4

2 回答 2

9

代码首先将数字加三。

然后它将最后两位归零以四舍五入为四的倍数。就像您可以通过用零替换最后两位数字来舍入到十进制中最接近的 100 倍数。)

如果数字已经是四的倍数,则将其添加三,然后向下舍入到最接近的四的倍数,根据需要保留它。如果数字比 4 的倍数多 1、2 或 3,则向其添加 3 会使其高于下一个 4 的倍数,然后根据需要向下舍入。

于 2011-11-18T05:28:58.153 回答
3

这实际上有一个微妙的错误。'& ~(sizeof(int) - 1)' 仅在 sizeof(int) 是 2 的幂,36 位和 80 位架构等确实存在时才有效。如果你把它改成 '% sizeof(int)' 那么它总是正确的。

于 2013-11-07T20:21:52.207 回答