2011-11-18 17 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)',那麼它總是正確的。