位移与乘法

use*_*143 7 javascript bit-shift multiplication

我正在尝试将字节数组转换为数字,对于大数字,我看到位移是给出-ve结果.你们其中一个人可以为什么我们看到这个问题?您是否看到使用"乘法"而不是"位移"的任何缺点?

例如,

<script language="JavaScript">
    var myVar = 1000000;
    document.write("Bit shift Result: " + (myVar << 8));
    document.write("<br>");
    document.write("Multiplication Result: " + parseInt(myVar *256));
</script>
Run Code Online (Sandbox Code Playgroud)

输出:

位移结果:256000000

乘法结果:256000000

在向myVar添加一个零之后,您会看到我正在讨论的问题

<script language="JavaScript">
    var myVar = 10000000;
    document.write("Bit shift Result: " + (myVar << 8));
    document.write("<br>");
    document.write("Multiplication Result: " + parseInt(myVar *256));
</script>
Run Code Online (Sandbox Code Playgroud)

输出:
位移结果:-1734967296

乘法结果:2560000000

Ben*_*aum 4

回答你的两个问题:

请问有人可以问为什么我们会看到这个问题吗?

JavaScript 数字是标准 IEEE 双精度数。

JavaScript 可以容纳的最大整数值是:9007199254740992

然而,位移运算符适用于 32 位整数。

我引用语言规范

5. 令 lnum 为 ToInt32(lval)。

...

返回对 lnum 执行符号扩展右移 shiftCount 位的结果。传播最高有效位。结果是一个带符号的 32 位整数。

您认为使用“乘法”而不是“位移位”有什么缺点吗?

它仍然有点慢,但无论如何,大多数时候你应该避免在 JavaScript 中直接处理非常大的数字。

有些库可以处理非常大的数字,并且正在讨论一些功能,以便为语言(ES7 值类型)添加对大数字的更好支持。

  • 当然 - 我知道根本问题对我们双方来说都是透明的,而且我确切地知道你的意思。我只是想找到向其他读者表达这些想法的最佳方式,既简洁又准确。 (2认同)