Javascript 位移位与乘法

Javascript 位移位与乘法,javascript,bit-shift,multiplication,Javascript,Bit Shift,Multiplication,我正在尝试将字节数组转换为数字,对于较大的数字, 我看到位移位正在产生-ve结果。 你们中有人能问一下为什么我们会看到这个问题吗?你认为用“乘法”代替“位移位”有什么缺点吗 比如说, <script language="JavaScript"> var myVar = 1000000; document.write("Bit shift Result: " + (myVar << 8)); document.write("<br>");

我正在尝试将字节数组转换为数字,对于较大的数字, 我看到位移位正在产生-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>

var-myVar=1000000;

write(“位移位结果:”+(myVar在JavaScript中,所有按位运算符首先调用操作数。这包括移位运算符


然后使用位运算符(即
)回答您的两个问题:

你们中有人能问一下为什么我们会看到这个问题吗? JavaScript数字是标准的IEEE双精度数字

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

但是,位移位运算符适用于32位整数

我引述:

5.将lnum设置为32(左心室)

返回通过移位计数位对lnum执行符号扩展右移的结果。传播最高有效位。结果为有符号32位整数

你认为用“乘法”代替“位移位”有什么缺点吗? 它仍然有点慢,但无论如何,您应该避免在大多数情况下直接在JavaScript中使用非常大的数字


有些库处理非常大的数字,有些功能正在讨论中,以更好地支持语言中的大数字(ES7值类型).

在内部,JavaScript使用带52位尾数的64位浮点表示所有数字。但是,您也可以进行位运算,但只能作为带符号的32位整数,从-2147483648到+2147483647。若要超出此范围,必须使用常规算术,而不是位运算。

@user2864740阅读在不同JavaScript引擎中实现此逻辑的代码,以及当前在v8中实现此逻辑的方式,它的速度较慢(至少最初是这样)。这对您来说足够了吗?从技术上讲,这是不对的:“JavaScript可以容纳的最大整数值是:9007199254740992”它可以精确地容纳9007199254740994、9007199254740996等以及许多其他更大的整数。我通常陈述这种想法的方式是9007199254740993是JavaScript无法容纳的最小正整数。@Matt here-这是我在JavaScript中以1000个零作为stirng的数字:“1e1000”-我的意思是-9007199254740992是不必担心精度的最大数字,JS中可以存储的最大数字是
1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000非常感谢BenjaminTo总结了答案:这是因为JavaScript很糟糕。它是制度化的疯狂——比如,特定的疯狂、定义明确的愚蠢、完全记录的疯狂。@Claudiu我不知道你在说什么,你会在其他编程语言(Java、C#、C等)中得到类似的结果也一样。@BenjaminGruenbaum:我的意思是所有JavaScript数字都是
double
s,但在某些情况下它们的行为就像int32,只是为了见鬼。如果你在C中对double进行位移,它将,嗯..对位进行移位。这里不是这种情况。另外,我的评论还提到了其他一些古怪的东西,比如所有数组索引实际上都是st环,如果可以转换为整数,则充当数组中的整数,如果不能转换,则充当属性。很棒的东西,都在规范中。@Claudiu对,因为键入是基于JavaScript中的行为。内部引擎将使用实际的C类数组(或32位整数)如果可能的话,作为一名开发人员,你不必担心。你的开发经验与C、Java、C#或Python没有什么不同。我同意这种语言很容易搞乱它(比如在数组中添加“name”之类的键),但这并不意味着任何人都应该/愿意这么做:)规范中所有的“不一致”都是有原因的,而这个原因不仅仅是“定义良好”或是在规范中。非常感谢;这是一个超快速的响应。
<script language="JavaScript">
    var myVar = 10000000;
    document.write("Bit shift Result: " + (myVar << 8));
    document.write("<br>");
    document.write("Multiplication Result: " + parseInt(myVar *256));
</script>
00000000 10011000 10010110 10000000 - original value, after [ToInt32], as bits
10011000 10010110 10000000 00000000 - value after shift; a negative bit pattern