JScript 8.0
按位运算符强制

此版本的 JScript 中的位运算符与以前版本的 JScript 中的位运算符完全兼容。此外,JScript 运算符还可以用于新的数值数据类型。位运算符的行为取决于数据的二进制表示形式,因此了解运算符如何强制数据类型是非常重要的。

可以将三种类型的参数传递到位运算符:早期绑定的变量、后期绑定的变量以及常值数据。早期绑定的变量是使用显式类型批注定义的变量。后期绑定的变量是包含数值数据的、类型为 Object 的变量。

按位与 (&)、或 (|) 非 XOR (^) 运算符

如果一个操作数是后期绑定的变量或者两个操作数均是常值数据,则将两个操作数被强制为 int (System.Int32),然后执行运算,返回的值为 int

如果两个操作数均是早期绑定的变量,或者其中一个操作数是常值数据,而另一个操作数是早期绑定的变量,则执行更多的步骤。将两个操作数强制为由以下两个条件确定的类型:

  • 如果操作数均非整型,则将两个操作数强制为 int

  • 如果只有一个操作数是整型,则将非整型操作数强制为整型或 int(取决于哪种类型更长)。

  • 如果一个操作数更长,则操作数强制后的类型与较长操作数具有相同的长度。

  • 如果其中一个操作数是无符号的,则操作数强制后的类型也是无符号的。否则,强制的类型是有符号的。

然后,将操作数强制为适当的类型,执行位运算并返回结果。结果的数据类型与被强制的操作数的类型相同。

当将整数用于位运算符和早期绑定的变量时,将整数解释为 intlongulongdouble(取决于哪种类型是表示该数字的最小类型)。decimal 常值被强制为 double。可能需要根据上述规则对常值数据的类型进行进一步的强制。

按位“非”(~) 运算符

如果操作数是后期绑定的变量、早期绑定的浮点变量或者是常值数据,则将它强制为 int (System.Int32),然后执行“非”运算,返回值为 int

如果操作数是早期绑定的整型数据类型,则执行“非”运算,返回的类型与操作数的类型相同。

按位左移 (<<)、右移 (>>) 运算符

如果左操作数是后期绑定的变量、早期绑定的浮点变量或者是常值数据,则将它强制为 int (System.Int32)。否则,左操作数是早期绑定的整型数据类型,并且不执行强制。右操作数始终被强制为整型数据类型。然后,对被强制的值执行移位运算,返回的结果与左操作数(如果是早期绑定的变量)或类型 int 具有相同的类型。

无符号右移 (>>>) 运算符

如果左操作数是后期绑定的变量、早期绑定的浮点变量或者是常值数据,则将它强制为 uint (System.UInt32)。否则,左操作数是早期绑定的整型数据类型,并将它强制为相同大小的无符号类型。例如,将 int 强制为 uint。右操作数始终被强制为整型数据类型。然后,对被强制的值执行移位运算,返回的结果与被强制的左操作数(如果是早期绑定的变量)或类型 uint 具有相同的类型。

无符号右移的结果始终很小,可以将它存储在有符号的返回类型版本中,而不会产生溢出。

请参见