为什么VBScript';有一种情况是按位和失败的?

为什么VBScript';有一种情况是按位和失败的?,vbscript,bit-manipulation,bitwise-operators,Vbscript,Bit Manipulation,Bitwise Operators,我正在使用VBScript解析一些Windows installer内容中的返回代码。我想确认我的按位操作是正确的,所以我记下了一些Echo语句,发现其中一条语句没有产生我预期的结果: WScript.Echo (&H01010101) ' prints 16843009 (0x01010101). Correct! WScript.Echo (&H01010101 And &Hff000000) ' prints 16777216 (0x0

我正在使用VBScript解析一些Windows installer内容中的返回代码。我想确认我的按位操作是正确的,所以我记下了一些
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!
第四个似乎只屏蔽了底部的两个字节。好的,当然,我想我可以看到,在它被
加密之前,它可能在哪里被转换成可以容纳它的最小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).

哪种说法支持它被存储在一个单词中,而不是DWORD中,但我仍然不太明白发生了什么。

&h0000ff00
不是被解释为长的,而是一个整数,在VBScript中是一个整数

Integer
:包含范围为-32768到32767的整数

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

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

为避免此陷阱,请告诉口译员通过附加另一个与符号将数字视为长:

WScript.Echo (&h01010101 And &h0000ff00&)
不过,仅仅在十六进制数上使用
CLng
是行不通的。如果您尝试过类似的方法:

CLng(&h0000ff00)

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

很好的解释。
WScript.Echo (&h01010101 And CLng("&h0000ff00"))
CLng(&h0000ff00)