2016-08-11 52 views
3

我正在使用VBScript來解析一些Windows安裝程序內的返回代碼。我想確認我在做正確的按位的東西,所以我記下了一些Echo報表,發現其中一人沒有產生結果,我預計:爲什麼VBScript會按位進行並且在一種情況下失敗?

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! 

這第四個只出現有屏蔽了底部的兩個字節。好吧,我想我可以看到它可能被轉換成最小的int,它可以在它得到And ed之前保存它,所以面具比被掩蓋的東西或類似的東西要短,但是爲什麼最後的情況會起作用?

如果我的東西扔在最高字節它的工作原理:

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

這裏有一些其他情況:

WScript.Echo (&H01010101 And &H0000f0ff) ' prints 16842753 (0x01010001). 
WScript.Echo (&H01010101 And &Hf00000ff) ' prints 1  (0x00000001). 

哪種類型的支持這一想法,它獲得存儲在一個WORD ,不是DWORD,但我仍然不明白髮生了什麼。

回答

3

&h0000ff00不被解釋爲Long,而是作爲Integer,它在VBScript中是16-bit (short) signed integer

Integer:包含-32,768到32,767範圍內的整數。

帶符號的整數使用Two's Complement編碼,這意味着以1開頭的位序列被解釋爲負數。因此,值&hff00變爲-256。

您的其他示例不會觸發此行爲,因爲它們要麼大於16位,因此它們會自動被視爲長或小於&h8000(32768或二進制1000 0000 0000 0000),所以它們是帶正號的整數。

爲了避免這一缺陷告訴解釋通過追加另一符號來當作一個長期的數量:

WScript.Echo (&h01010101 And &h0000ff00&)

,或者使用十進制值:

WScript.Echo (&h01010101 And 65280)

你也可以定義十六進制數作爲一個字符串,並將其轉換爲Long使用CLng函數:

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

雖然在十六進制數字上只使用CLng不起作用。如果你試過這樣的事情:

CLng(&h0000ff00) 

數量將已經是(負)符號的短整型時功能能夠查看這些信息。

+0

很好的解釋。 – Lankymart

相關問題