作成しているプログラムにHIDWORDマクロが必要でしたが、これは次の場所にあります:http: //gnuwin32.sourceforge.net/compile.html
私が混乱しているのは、なぜ&0xFFFFFFFF
それの終わりにあるのですか?
#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))
それはこのマクロの出力をどのように変更しますか?
作成しているプログラムにHIDWORDマクロが必要でしたが、これは次の場所にあります:http: //gnuwin32.sourceforge.net/compile.html
私が混乱しているのは、なぜ&0xFFFFFFFF
それの終わりにあるのですか?
#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))
それはこのマクロの出力をどのように変更しますか?
それが実際の効果を持っているとは思いません-(DWORD)
式の最終操作がとにかく結果を32ビットに強制するというキャスト。
(DWORDLONG)
キャストにより、シフト操作が符号なしの値に作用するように強制されるため、「符号ビット」は中間結果にシフトされません。ただし、オペランドは64ビットである可能性があるため、ビット31よりも高い位置にゼロ以外のビットが存在する可能性があります。& 0xFFFFFFFF
操作ではこれらのビットがゼロになりますが、(DWORD)
キャストもゼロになります。
しかし、それも害はありません。マクロの意図がより明確になると主張する人もいるかもしれません(あなたを除いて、たぶん-冗談です!)。
上位ビットを明示的にマスクすることにより、可能な符号拡張を処理します。コンパイラが実際に負の右シフトの符号拡張を行うかどうかは、実装によって定義されます。
編集:符号拡張とは、数値がシフトされたときに符号を保持するように上位ビットを設定することを指します。
例えば:
11111110
8ビットの2の補数であると仮定すると、は-2です。単純な論理右シフトを実行すると、次のようになります。
01111111
ただし、それによって数値の符号が変わります。多くのコンパイラは、次のように算術シフトを実行します。
11111111
最上位ビット(より複雑な例では複数になる)に1を入力することに注意してください。
それらが符号なしタイプであると仮定し、DWORD
が32ビットでDWORDLONG
64ビットであると仮定すると、技術的には何もしません。
おそらく、署名された型の同様のマクロのコピーアンドペーストから残ったコードだけですか?
あるいは、私が指摘した仮定の1つが当てはまらないかもしれません。
乾杯&hth。、