【问题标题】:Way to round up number to an int size boundary number of bytes将数字四舍五入到 int 大小边界字节数的方法
【发布时间】:2011-12-31 23:08:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 将最后一位更改为& ~(sizeof(int)) 有效吗?

标签: c macros bit-manipulation c-preprocessor boundary


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    代码首先将数字加三。

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

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

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多