为什么JavaScript是按位的或行为异常?

为什么JavaScript是按位的或行为异常?,javascript,types,boolean-logic,Javascript,Types,Boolean Logic,在JavaScript中,似乎: (4294958077 | 0) == -9219 为什么不是4294958077 这表明存在某种溢出(尽管据我所知,JavaScript数字类型的范围是+/-9007199254740992,所以这本身就很奇怪) 即使这是一个溢出,当然 (4294958077 | 0) == 4294958077 应该评估为真-但事实并非如此 请提供帮助Javascript中的所有数字都是64位浮点数。浮点上的按位操作是一种边缘情况,因此在内部,这些浮点暂时转换为32位整

在JavaScript中,似乎:

(4294958077 | 0) == -9219
为什么不是4294958077

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

即使这是一个溢出,当然

(4294958077 | 0) == 4294958077
应该评估为真-但事实并非如此


请提供帮助

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

JavaScript按位数字存储为带符号的64位浮点,也就是说,整数只有32位可供使用,您已经超过了32位,因此,通过尽可能将其转换为整数,然后执行该操作,情况变得很奇怪


更多信息(特别是“beyond 32-bit”部分),但没有真正的解决方案,因此很遗憾,您需要解决它。

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

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

  • 设lref为计算A的结果
  • 设lval为GetValue(lref)
  • 设rref为评估B的结果
  • 设rval为GetValue(rref)
  • 将lnum设置为32(左心室)。
  • 将rnum设置为32(rval)。
  • 返回将按位运算符@应用于lnum和rnum的结果结果是一个有符号的32位整数。
  • 4294958077转换为有符号32位整数(使用ECMA-262§9.5中的算法)为-9219,且0仍然为0,因此按位or将返回-9219。

    检查此项:
    警报((4294958077 | 0))+1,如(4294958077 | 0)>>>0==4294958077非-9219所示