为什么VBScript会按位进行并且在一种情况下失败?
问题描述:
我正在使用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,但我仍然不明白发生了什么。
答
&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)
数量将已经是(负)符号的短整型时功能能够查看这些信息。
很好的解释。 – Lankymart