1. 程式人生 > >c語言中可變引數中_INTSIZEOF(n)巨集的解釋

c語言中可變引數中_INTSIZEOF(n)巨集的解釋

_INTSIZEOF(n)

定義: 

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

1 我們知道對於IX86,sizeof(int)一定是4的整數倍,所以~(sizeof(int) - 1) )的值一定是 
右面[sizeof(n)-1]/2位為0(因為3表示為0000 0011,取反為1111 1100,同樣7表示為0000 0111,取反為1111 1000),整個這個巨集也就是保證了右面[sizeof(n)-1]/2位為0,其餘位置 
為1,所以_INTSIZEOF(n)的值只有可能是4,8,16,......等等,實際上是實現了位元組對齊。

2 #define _INTSIZEOF(n)  ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) 
的目的在於把sizeof(n)的結果變成至少是sizeof(int)的整倍數,這個一般用來在結構中實現按int的倍數對齊。 
如果sizeof(int)是4,那麼,當sizeof(n)的結果在1~4之間是,_INTSIZEOF(n)的結果會是4;當sizeof(n)的結果在5~8時,

_INTSIZEOF(n)的結果會是8;當sizeof(n)的結果在9~12時,_INTSIZEOF(n)的結果會是12;……總之,會是sizeof(int)的倍數。

理論基礎:

對於兩個正整數 x, n 總存在整數 q, r 使得

x = nq + r, 其中  0<= r <n                  //最小非負剩餘

q, r 是唯一確定的。q = [x/n]("[]"表示取整), r = x - n[x/n]. 這個是帶餘除法的一個簡單形式。在 c 語言中, q, r 容易計算出來: q = x/n, r = x % n.


所謂把 x 按 n 對齊指的是:若 r=0, 取 qn, 若 r>0, 取 (q+1)n. 這也相當於把 x 表示為:

x = nq + r', 其中 -n < r' <=0                //最大非正剩餘   

nq 是我們所求。關鍵是如何用 c 語言計算它。由於我們能處理標準的帶餘除法,所以可以把這個式子轉換成一個標準的帶餘除法,然後加以處理:

x+n = qn + (n+r'),其中 0<n+r'<=n            //最大正剩餘

x+n-1 = qn + (n+r'-1), 其中 0<= n+r'-1 <n    //最小非負剩餘

所以 qn = [(x+n-1)/n]n. 用 c 語言計算就是:

((x+n-1)/n)*n

若 n 是 2 的方冪, 比如 2^m,則除為右移 m 位,乘為左移 m 位。所以把 x+n-1 的最低 m 個二進位制位清 0就可以了。得到:

(x+n-1) & (~(n-1))

原文參考:http://hi.baidu.com/kiropower/item/f0ee69273de922caddf69a07