2016-08-11 1 views
3

私はいくつかのWindowsインストーラの中でVBScriptを使用して戻りコードを解析しています。私は正しくビット単位のものをやっていたことを確認したかったので、私はいくつかのEcho文を書き留め、そのうちの一つは、私が期待した結果を生じなかったことが判明:VBScriptのビット単位がなぜ1つのケースで失敗するのですか?

WScript.Echo (&H01010101)    ' prints 16843009 (0x01010101). Correct! 
WScript.Echo (&H01010101 And &Hff000000) ' prints 16777216 (0x01000000). Correct! 
WScript.Echo (&H01010101 And &H00ff0000) ' prints 65536 (0x00010000). Correct! 
WScript.Echo (&H01010101 And &H0000ff00) ' prints 16843008 (0x01010100). What's happening here? 
WScript.Echo (&H01010101 And &H000000ff) ' prints 1  (0x00000001). Correct! 

第1のみが持っているように見えること下の2バイトをマスクしました。さて、確かに、Andが得られる前にそれを保持することができる最小のintに変換される可能性がありますので、マスクはマスクされているものよりも短くなっていますが、 ?

私はそれが動作する最上位バイトで何かを投げる場合:

WScript.Echo (&H01010101 And &Hf000ff00) ' prints 256  (0x01010100). 

、ここで他のいくつかの例です:

ソートのそれはWORDに保存されたばかりだという考えを支持
WScript.Echo (&H01010101 And &H0000f0ff) ' prints 16842753 (0x01010001). 
WScript.Echo (&H01010101 And &Hf00000ff) ' prints 1  (0x00000001). 

、DWORDではなく、私はまだ何が起こっているのか本当に理解していない。

答えて

3

&h0000ff00は、Longとして解釈されず、VBScriptでは16-bit (short) signed integerのIntegerとして解釈されます。

Integer:-32,768~32,767の範囲の整数を含みます。

符号付き整数は1始まるビット列を負の数として解釈されることを意味し、Two's Complementを使用して符号化されます。したがって、値&hff00は-256になります。

他の例では、16ビットより大きいため、自動的にLongとして扱われるため、この動作は発生しません。&h8000(32768またはバイナリ1000 0000 0000 0000)より小さいため、正の符号付き整数。この落とし穴を避けるために

別のアンパサンドを追加することによって、ロングとして番号を治療するためのインタプリタを教えて:あなたはまた、進数を定義することができ

WScript.Echo (&h01010101 And 65280)

WScript.Echo (&h01010101 And &h0000ff00&)

または10進値を使用します文字列として、CLng関数を使用してLongに変換します。

WScript.Echo (&h01010101 And CLng("&h0000ff00"))

ちょうどCLngを16進数で使用しても動作しません。あなたはこのような何かをしようとした場合:

CLng(&h0000ff00) 

数はすでに(マイナス)になる機能は、それを見るために取得するときに短い符号付き整数。

+0

大きな説明。 – Lankymart

関連する問題