在JavaScript中,似乎:
(4294958077 | 0) == -9219
为什么不是4294958077?
它表明存在某种溢出(虽然我理解它的JavaScript数字类型的范围是+/- 9007199254740992,所以这本身就很奇怪。)
即使是溢出,肯定是
(4294958077 | 0) == 4294958077
应评估为真 - 但事实并非如此。
请帮助
答案 0 :(得分:5)
它与浮点类型或溢出无关。它返回-9219 因为标准要求它,因为所有二进制按位操作必须使用带符号 32位整数(ECMA-262§11.10)完成。
生产 A : A @ B ,其中@是上述产品中的一个按位运算符,其计算方法如下:
- 让 lref 成为评估 A 的结果。
- 让 lval 为GetValue( lref )。
- 让 rref 成为评估 B 的结果。
- 让 rval 为GetValue( rref )。
- 让 lnum 为ToInt32( lval )。
- 让 rnum 为ToInt32( rval )。
- 返回将按位运算符@应用于 lnum 和 rnum 的结果。 结果是带符号的32位整数。
醇>
4294958077转换为带符号的32位整数(使用ECMA-262§9.5中的算法)是-9219,而0仍然是0,所以按位 - 或将返回-9219。
答案 1 :(得分:2)
Javascript中的所有数字都是64位浮点数。浮点上的按位运算是边缘情况,因此内部的浮点数暂时转换为32位int,然后执行按位运算 - 因此溢出。
答案 2 :(得分:0)
JavaScript按位数存储为带符号的64位浮点数,即你只有32位用于你已经超过的整数,所以通过将其转换为整数,它可以做到最好然后做操作。
更多信息here(尤其是'超越32位'部分)但没有真正的解决方案,所以不幸的是,你需要解决它。