【问题标题】:Why is JavaScript bitwise OR behaving strangely?为什么 JavaScript 按位或行为奇怪?
【发布时间】:2012-03-08 22:48:13
【问题描述】:

在 JavaScript 中,似乎:

(4294958077 | 0) == -9219

为什么不是 4294958077?

这表明存在某种溢出(尽管据我了解,JavaScript 数字类型的范围是 +/- 9007199254740992,所以这本身就很奇怪。)

即使是溢出,也一定

(4294958077 | 0) == 4294958077

应该评估为真 - 但事实并非如此。

请帮忙

【问题讨论】:

  • 看看这个:alert( (4294958077 | 0) );

标签: javascript types boolean-logic


【解决方案1】:

Javascript 中的所有数字都是 64 位浮点数。浮点数的按位运算是一种边缘情况,因此在内部这些浮点数会暂时转换为 32 位 int,然后执行按位运算 - 因此会溢出。

【讨论】:

    【解决方案2】:

    JavaScript 位数字存储为带符号的 64 位浮点数,即您只有 32 位可用于整数,您已经超过了,所以通过尽其所能将其转换为整数然后执行它变得很奇怪操作。

    更多信息here(尤其是“超越 32 位”部分)但没有真正的解决方案,所以很遗憾,您需要解决它。

    【讨论】:

      【解决方案3】:

      它与浮点类型或溢出无关。它返回 -9219 因为标准要求这样做,因为所有二进制按位运算都必须使用 signed 32 位整数 (ECMA-262 §11.10)。

      产生式 A : A @ B,其中 @ 是上述产生式中的位运算符之一,计算如下:

      1. lref 为评估 A 的结果。
      2. lval 为 GetValue(lref)。
      3. rref 为评估 B 的结果。
      4. rval 为 GetValue(rref)。
      5. lnum 为 ToInt32(lval)。
      6. rnum 为 ToInt32(rval)。
      7. 返回将按位运算符@ 应用于lnumrnum 的结果。 结果是一个有符号的 32 位整数。

      4294958077 转换为带符号的 32 位整数(使用 ECMA-262 §9.5 中的算法)是 -9219,而 0 仍然是 0,因此按位或将返回 -9219。

      【讨论】:

      • +1 如 (4294958077 | 0) >>> 0 === 4294958077 不是 -9219 所示
      猜你喜欢
      • 2013-12-09
      • 2011-11-05
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 2021-06-01
      • 2015-09-24
      相关资源
      最近更新 更多