_INTSIZEOF(n) 原理

來源:互聯網
上載者:User

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

1 我們知道對於IX86,sizeof(int)一定是4的整數倍,所以~(sizeof(int) - 1) )的值一定是 

右面[sizeof(n)-1]/2位為0,整個這個宏也就是保證了右面[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))

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.