2011-11-18 37 views
1

以下代码将参数舍入为int大小边界字节数。将数字向上舍入为int大小边界字节数的方法

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

在我的机器int是4个字节,所以 - 纠正我,如果我错了 - 这应该是一样找一个整数的4的倍数(我的机器上)。接下来是4的倍数,我的意思是数字应该四舍五入为4的倍数,如果不是4的倍数。如果已经是4的倍数,它应该被单独留下。

我一直在玩这个代码。它的长短是:为什么此代码有效?(也许它不会,但它似乎。)我想一些理由认为它可以适用于所有情况,而不仅仅是我已经试过的。

+0

确实将最后一位更改为'&〜(sizeof(int))'工作? – BudgieInWA

回答

8

该代码首先将三个数字相加。

然后它将最后两位归零为四舍五入。就像你可以通过用零代替最后两位数字一样舍入到小数点后100位的最接近倍数。)

如果数字已经是4的倍数,则向其中添加3,然后向下舍入到最接近的倍数根据需要,四个叶子独自一人。如果数字是1,2或3多于4的倍数,则将其加3会使其高于4的下一个倍数,然后将其舍入到下一个数字,完全按照需要进行。

2

这其实有一个微妙的错误。如果sizeof(int)是2的幂,那么'&〜(sizeof(int)-1)'只有36位和80位体系结构存在。如果您将其更改为'%sizeof(int)',那么它总是正确的。