【发布时间】:2013-12-13 23:48:51
【问题描述】:
我正在尝试将字节数组转换为数字,对于大数字, 我看到位移给出了 -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>
输出:
位移结果: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>
输出:
位移结果:-1734967296乘法结果:2560000000
【问题讨论】:
-
总结答案:这是因为 JavaScript 很糟糕。它是制度化的疯狂——例如,特定的疯狂、明确定义的疯狂、彻底记录的疯狂。
-
@Claudiu 我不知道你在说什么,你在其他编程语言(Java、C#、C 等)中也会得到类似的结果。
-
@BenjaminGruenbaum:我的意思是所有 JavaScript 数字都是
doubles,但在某些情况下它们的行为就像 int32 一样,只是为了它的见鬼。如果您在 C 中对 double 进行位移,它会,嗯..位移位。这不是这里的情况。另外,我的评论还提到了其他一些古怪的东西,比如所有数组索引实际上都是字符串,如果它们可以转换为整数,则充当数组中的整数,但如果不是,则充当属性。很棒的东西,而且都在规范中。 -
@Claudiu 对,因为打字是基于 JavaScript 中的行为。在可能的情况下,内部引擎将使用实际的 C 类数组(或 32 位整数),并且作为开发人员,您不必担心它。您的开发经验与 C、Java、C# 或 Python 没有什么不同。我确实同意该语言很容易弄乱它(例如将“名称”之类的键添加到数组中),但这并不意味着任何人都应该/会这样做:)所有“不一致”都在规范中原因,而这个原因不仅仅是“定义明确”或符合规范。
标签: javascript bit-shift multiplication