javascript - 为什么 JavaScript 按位或行为异常?

标签 javascript types boolean-logic

在 JavaScript 中,似乎:

(4294958077 | 0) == -9219

为什么不是 4294958077 ?

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

就算是溢出,也一定

(4294958077 | 0) == 4294958077

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

请帮忙

最佳答案

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

The production A : A @ B, where @ is one of the bitwise operators in the productions above, is evaluated as follows:

  1. Let lref be the result of evaluating A.
  2. Let lval be GetValue(lref).
  3. Let rref be the result of evaluating B.
  4. Let rval be GetValue(rref).
  5. Let lnum be ToInt32(lval).
  6. Let rnum be ToInt32(rval).
  7. Return the result of applying the bitwise operator @ to lnum and rnum. The result is a signed 32 bit integer.

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

关于javascript - 为什么 JavaScript 按位或行为异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9329899/

相关文章:

javascript - 错误 : document is not defined

javascript - WScript.Shell 在 FireFox 中不工作

javascript - (Spring,AngularJS)我不知道为什么它是NULL

jquery 引用 CSS 类型选择器的问题

if-statement - 如何比较 Google 表格中的两个公式(计算)单元格

javascript - 可点击的三个 Js Objects/Convex Items

python - 检查对象是否为十进制的正确方法

python - 有没有办法在重新索引/上采样时间序列时防止 dtype 从 Int64 更改为 float64?

haskell - 如果“任一个”可以是“左”或“右”,但不能同时是“左”或“右”,那么为什么在Curry-Howard对应中它对应于OR而不是XOR?

algorithm - 出于缓存原因规范化 bool 表达式。有没有比真值表更有效的方法?