4

作成しているプログラムにHIDWORDマクロが必要でしたが、これは次の場所にあります:http: //gnuwin32.sourceforge.net/compile.html

私が混乱しているのは、なぜ&0xFFFFFFFFそれの終わりにあるのですか?

#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))

それはこのマクロの出力をどのように変更しますか?

4

3 に答える 3

5

それが実際の効果を持っているとは思いません-(DWORD)式の最終操作がとにかく結果を32ビットに強制するというキャスト。

(DWORDLONG)キャストにより、シフト操作が符号なしの値に作用するように強制されるため、「符号ビット」は中間結果にシフトされません。ただし、オペランドは64ビットである可能性があるため、ビット31よりも高い位置にゼロ以外のビットが存在する可能性があります。& 0xFFFFFFFF操作ではこれらのビットがゼロになりますが、(DWORD)キャストもゼロになります。

しかし、それも害はありません。マクロの意図がより明確になると主張する人もいるかもしれません(あなたを除いて、たぶん-冗談です!)。

于 2010-12-15T05:44:48.203 に答える
1

上位ビットを明示的にマスクすることにより、可能な符号拡張を処理します。コンパイラが実際に負の右シフトの符号拡張を行うかどうかは、実装によって定義されます

編集:符号拡張とは、数値がシフトされたときに符号を保持するように上位ビットを設定することを指します。

例えば:

11111110

8ビットの2の補数であると仮定すると、は-2です。単純な論理右シフトを実行すると、次のようになります。

01111111

ただし、それによって数値の符号が変わります。多くのコンパイラは、次のように算術シフトを実行します。

11111111

最上位ビット(より複雑な例では複数になる)に1を入力することに注意してください。

于 2010-12-15T05:39:03.007 に答える
0

それらが符号なしタイプであると仮定し、DWORDが32ビットでDWORDLONG64ビットであると仮定すると、技術的には何もしません。

おそらく、署名された型の同様のマクロのコピーアンドペーストから残ったコードだけですか?

あるいは、私が指摘した仮定の1つが当てはまらないかもしれません。

乾杯&hth。、

于 2010-12-15T06:20:35.870 に答える