为什么JavaScript按位或奇怪地表现?

时间:2012-02-17 14:23:00

标签: javascript types boolean-logic

在JavaScript中,似乎:

(4294958077 | 0) == -9219

为什么不是4294958077?

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

即使是溢出,肯定是

(4294958077 | 0) == 4294958077

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

请帮助

3 个答案:

答案 0 :(得分:5)

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

  

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

     
      
  1. lref 成为评估 A 的结果。
  2.   
  3. lval 为GetValue( lref )。
  4.   
  5. rref 成为评估 B 的结果。
  6.   
  7. rval 为GetValue( rref )。
  8.   
  9. lnum 为ToInt32( lval )。
  10.   
  11. rnum 为ToInt32( rval )。
  12.   
  13. 返回将按位运算符@应用于 lnum rnum 的结果。 结果是带符号的32位整数。
  14.   

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

JavaScript按位数存储为带符号的64位浮点数,即你只有32位用于你已经超过的整数,所以通过将其转换为整数,它可以做到最好然后做操作。

更多信息here(尤其是'超越32位'部分)但没有真正的解决方案,所以不幸的是,你需要解决它。