このページを編集する際は、[[編集に関する方針]]に従ってください。 *概要 [#p882ab57] -対象:8.1.4 -言語:C -[[postgresql-8.1.4/src/include/c.h]]にて定義 -LEN以上であるALIGNVALの倍数のうち、最小値を返す。(備考を参照) -LEN+ALIGNVAL-1の値と、ALIGNVAL-1の値の補数の間で、ビットごとのAND演算を行い、その結果を返す。 *引数 [#ob991a32] +ALIGNVAL : 数値または式 +LEN : 数値または式 *実装 [#jfc46648] #define TYPEALIGN(ALIGNVAL,LEN) \ (((long) (LEN) + ((ALIGNVAL) - 1)) & ~((long) ((ALIGNVAL) - 1))) *呼出元 [#tf42b347] -[[INTALIGN()/postgresql-8.1.4]] -[[DOUBLEALIGN()/postgresql-8.1.4]] -[[SHORTALIGN()/postgresql-8.1.4]] *備考 [#s788901e] LEN以上のALIGNVALの倍数のうち最小の値を返す。 -[[ソースコードを読むだけでは意味がわからない①/解読日記]]参照 **例1:ALIGNVALが4で、LENが9の場合、 [#hc70565d] -前半の式 (long) (LEN) + ((ALIGNVAL) - 1) = (long) (9) + ((4) - 1) = 12 -後半の式 (long) ((ALIGNVAL) - 1) = (long) ((4) - 1) = 3 前半の式と、後半の式の補数を、AND演算すると、 12 : 00001100 ~3 : 11111100 AND : 00001100 = 12 **例2:ALIGNVALが4で、LENが7の場合、 [#lfb358ab] -前半の式 (long) (LEN) + ((ALIGNVAL) - 1) = (long) (7) + ((4) - 1) = 10 -後半の式 (long) ((ALIGNVAL) - 1) = (long) ((4) - 1) = 3 前半の式と、後半の式の補数を、AND演算すると、 10 : 00001010 ~3 : 11111100 AND : 00001000 = 8 **例3:ALIGNVALが4で、LENが5の場合、 [#r3c0e3ab] -前半の式 (long) (LEN) + ((ALIGNVAL) - 1) = (long) (5) + ((4) - 1) = 8 -後半の式 (long) ((ALIGNVAL) - 1) = (long) ((4) - 1) = 3 前半の式と、後半の式の補数を、AND演算すると、 8 : 00001000 ~3 : 11111100 AND : 00001000 = 8 **例4:ALIGNVALが4で、LENが4の場合、 [#zc3e625c] -前半の式 (long) (LEN) + ((ALIGNVAL) - 1) = (long) (4) + ((4) - 1) = 7 -後半の式 (long) ((ALIGNVAL) - 1) = (long) ((4) - 1) = 3 前半の式と、後半の式の補数を、AND演算すると、 7 : 00000111 ~3 : 11111100 AND : 00000100 = 4 **例5:ALIGNVALが4で、LENが1の場合、 [#i18867df] -前半の式 (long) (LEN) + ((ALIGNVAL) - 1) = (long) (1) + ((4) - 1) = 4 -後半の式 (long) ((ALIGNVAL) - 1) = (long) ((4) - 1) = 3 前半の式と、後半の式の補数を、AND演算すると、 4 : 00000100 ~3 : 11111100 AND : 00000100 = 4 -[[ソースコードを読むだけでは意味がわからない①/解読日記]]参照 *履歴 [#i7342625] -作者:[[testnoda/ページ作者]] -日付:2006/9/11 |更新日|更新者|更新内容| |2006/9/23|[[testnoda:http://d.hatena.ne.jp/testnoda/about]]|概要に、命令の説明だけでなく、動作の説明を追記した。(備考に動作事例を書いて、動作を考え、説明の根拠とした)| *コメント [#aa563454] #comment