为什么VBScript';有一种情况是按位和失败的?
我正在使用VBScript解析一些Windows installer内容中的返回代码。我想确认我的按位操作是正确的,所以我记下了一些为什么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
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)