为什么JavaScript中0的按位移位在某些情况下会产生奇怪的结果
只是在JavaScript中玩了一些不寻常的按位操作,在某些情况下我得到了一些奇怪的结果: 常见情况为什么JavaScript中0的按位移位在某些情况下会产生奇怪的结果,javascript,bitwise-operators,Javascript,Bitwise Operators,只是在JavaScript中玩了一些不寻常的按位操作,在某些情况下我得到了一些奇怪的结果: 常见情况 10//返回100,绝对有意义 但当移位0位时,所有这些都将产生零 9E99>0//还返回0。。。。。全部清除? 无穷大>>0//返回0 JavaScript中的无限位移位和逻辑运算计算为32位整数。来自MDN的: 所有按位运算符的操作数都转换为2的补码格式的有符号32位整数 JavaScript中的所有数字都是。在应用逐位运算符之前,它们被转换为32位整数 更准确地说,这一过程如所述: 如
10//返回100,绝对有意义
但当移位0位时,所有这些都将产生零
9E99>0//还返回0。。。。。全部清除?
无穷大>>0//返回0
JavaScript中的无限位移位和逻辑运算计算为32位整数。来自MDN的:
所有按位运算符的操作数都转换为2的补码格式的有符号32位整数
JavaScript中的所有数字都是。在应用逐位运算符之前,它们被转换为32位整数
更准确地说,这一过程如所述:
如您所见,对无穷大和-0
的变换进行了精确描述
这是一个二进制截断,这也解释了为什么将9E99
更改为0
:如果您查看(9E99)右侧的32位,这一点最为明显
基本上,JS编译器使用ECMA-262第9.5项中描述的算法将浮点参数转换为32位整数。在您提到的大多数情况下,转换的结果为0 (数学幂表示法,而不是异或运算符)我刚刚试过2^32我试过用2^32进行几次逐位运算,发现在进行任何逐位运算时,数字都会被二进制截断为32位,正如您所解释的。2^32变为0,2^32+1变为1。我可能会研究其他语言,看看它们在规格方面的差异。
1 << 0 // returns 1, makes sense
100 << 0 // returns 100, makes sense
100 >> 0 // returns 100, definitely makes sense
9E99 << 0 // returns 0 ..... Why all bits are cleared?
9E99 >> 0 // returns 0 also ..... All bits cleared?
Infinity >> 0 // returns 0
Infinity << 0 // returns 0
-Infinity << 0 // returns 0 .... Can't explain why
-0 << 0 // also yields 0 not -0 itself
-0 >> 0 // also resolved to 0
1 << Infinity // returns 1 .. no changes
1024 << Infinity // returns 1024 .. no changes
1024 >> Infinity // returns 1024 .. no changes either
Infinity >> Infinity // 0
Infinity << Infinity // 0