按位运算符强制
此版本的 JScript 中的位运算符与以前版本的 JScript 中的位运算符完全兼容。 此外,JScript 运算符还可以用于新的数值数据类型。 位运算符的行为取决于数据的二进制表示形式,因此了解运算符如何强制数据类型是非常重要的。
可以将三种类型的参数传递到位运算符:早期绑定的变量、后期绑定的变量以及常值数据。 早期绑定的变量是使用显式类型批注定义的变量。 后期绑定的变量是包含数值数据的、类型为 Object 的变量。
按位与 (&)、或 (|) 非 XOR (^) 运算符
如果一个操作数是后期绑定的变量或者两个操作数均是常值数据,则将两个操作数被强制为 int (System.Int32),然后执行运算,返回的值为 int。
如果两个操作数均是早期绑定的变量,或者其中一个操作数是常值数据,而另一个操作数是早期绑定的变量,则执行更多的步骤。 将两个操作数强制为由以下两个条件确定的类型:
如果操作数均非整型,则将两个操作数强制为 int。
如果只有一个操作数是整型,则将非整型操作数强制为整型或 int(取决于哪种类型更长)。
如果一个操作数更长,则操作数强制后的类型与较长操作数具有相同的长度。
如果其中一个操作数是无符号的,则操作数强制后的类型也是无符号的。 否则,强制的类型是有符号的。
然后,将操作数强制为适当的类型,执行位运算并返回结果。 结果的数据类型与被强制的操作数的类型相同。
当将整数用于位运算符和早期绑定的变量时,将整数解释为 int、long、ulong 或 double(取决于哪种类型是表示该数字的最小类型)。 decimal 常值被强制为 double。 可能需要根据上述规则对常值数据的类型进行进一步的强制。
按位“非”(~) 运算符
如果操作数是后期绑定的变量、早期绑定的浮点变量或者是常值数据,则将它强制为 int (System.Int32),然后执行“非”运算,返回值为 int。
如果操作数是早期绑定的整型数据类型,则执行“非”运算,返回的类型与操作数的类型相同。
按位左移 (<<)、右移 (>>) 运算符
如果左操作数是后期绑定的变量、早期绑定的浮点变量或者是常值数据,则将它强制为 int (System.Int32)。 否则,左操作数是早期绑定的整型数据类型,并且不执行强制。 右操作数始终被强制为整型数据类型。 然后,对被强制的值执行移位运算,返回的结果与左操作数(如果是早期绑定的变量)或类型 int 具有相同的类型。
无符号右移 (>>>) 运算符
如果左操作数是后期绑定的变量、早期绑定的浮点变量或者是常值数据,则将它强制为 uint (System.UInt32)。 否则,左操作数是早期绑定的整型数据类型,并将它强制为相同大小的无符号类型。 例如,将 int 强制为 uint。 右操作数始终被强制为整型数据类型。 然后,对被强制的值执行移位运算,返回的结果与被强制的左操作数(如果是早期绑定的变量)或类型 uint 具有相同的类型。
无符号右移的结果始终很小,可以将它存储在有符号的返回类型版本中,而不会产生溢出。