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
回答你的两个问题:
JavaScript 数字是标准 IEEE 双精度数。
JavaScript 可以容纳的最大整数值是:9007199254740992
然而,位移运算符适用于 32 位整数。
我引用语言规范:
5. 令 lnum 为 ToInt32(lval)。
...
返回对 lnum 执行符号扩展右移 shiftCount 位的结果。传播最高有效位。结果是一个带符号的 32 位整数。
它仍然有点慢,但无论如何,大多数时候你应该避免在 JavaScript 中直接处理非常大的数字。
有些库可以处理非常大的数字,并且正在讨论一些功能,以便为语言(ES7 值类型)添加对大数字的更好支持。