Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaScript中0的按位移位在某些情况下会产生奇怪的结果_Javascript_Bitwise Operators - Fatal编程技术网

为什么JavaScript中0的按位移位在某些情况下会产生奇怪的结果

为什么JavaScript中0的按位移位在某些情况下会产生奇怪的结果,javascript,bitwise-operators,Javascript,Bitwise Operators,只是在JavaScript中玩了一些不寻常的按位操作,在某些情况下我得到了一些奇怪的结果: 常见情况 10//返回100,绝对有意义 但当移位0位时,所有这些都将产生零 9E99>0//还返回0。。。。。全部清除? 无穷大>>0//返回0 JavaScript中的无限位移位和逻辑运算计算为32位整数。来自MDN的: 所有按位运算符的操作数都转换为2的补码格式的有符号32位整数 JavaScript中的所有数字都是。在应用逐位运算符之前,它们被转换为32位整数 更准确地说,这一过程如所述: 如

只是在JavaScript中玩了一些不寻常的按位操作,在某些情况下我得到了一些奇怪的结果:

常见情况

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