为什么 VBScript 的按位 And 在一种情况下失败?

Why is VBScript's bitwise And failing in one case?

我正在使用 VBScript 解析一些 Windows 安装程序内容中的 return 代码。我想确认我是否正确地执行了按位运算,所以我记下了一些 Echo 语句,发现其中一个语句没有产生我预期的结果:

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!

第四个似乎只屏蔽了底部的两个字节。好的,当然,我想我可以看到在它被 Anded 之前它可能被转换成可以容纳它的最小 int,所以掩码比被掩码的东西或类似的东西短,但是为什么最后的案例工作?

如果我在最高字节中输入一些东西,它会起作用:

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 中,但我仍然不太明白发生了什么。

&h0000ff00 不解释为 Long,而是解释为 Integer,在 VBScript 中是 16-bit (short) signed integer.

Integer: Contains integer in the range -32,768 to 32,767.

有符号整数使用 Two's Complement 编码,这意味着以 1 开头的位序列被解释为负数。因此值 &hff00 变为 -256。

您的其他示例不会触发此行为,因为它们要么大于 16 位,因此被自动视为 Long,要么小于 &h8000(32768,或二进制 1000 0000 0000 0000), 所以它们是正整数。

为了避免这个陷阱,告诉解释器通过附加另一个符号将数字视为 Long:

WScript.Echo (&h01010101 And &h0000ff00<b>&</b>)

或使用十进制值:

WScript.Echo (&h01010101 And <b>65280</b>)

您还可以将十六进制数字定义为字符串,并使用 CLng 函数将其转换为 Long:

WScript.Echo (&h01010101 And <b>CLng("&h0000ff00")</b>)

不过,仅对十六进制数使用 CLng 是行不通的。如果您尝试过这样的操作:

CLng(&h0000ff00)

当函数看到它时,该数字已经是一个(负)有符号短整数。