为什么 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!
第四个似乎只屏蔽了底部的两个字节。好的,当然,我想我可以看到在它被 And
ed 之前它可能被转换成可以容纳它的最小 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)
当函数看到它时,该数字已经是一个(负)有符号短整数。
我正在使用 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!
第四个似乎只屏蔽了底部的两个字节。好的,当然,我想我可以看到在它被 And
ed 之前它可能被转换成可以容纳它的最小 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)
当函数看到它时,该数字已经是一个(负)有符号短整数。