我已经完成了最低和最高整数值的实验,如果我走高,它会分别遍历为负数或正数。
var x = new Int32Array(3);
x[0] = 2147483647;
x[1] = -2147483648;
console.log(x[0]);
console.log(x[1]);
console.log(x.length);
//Results:
//2147483647 cannot go above unless -2147483648*
//-2147483648 cannot go above unless 2147483647*
//2
有人可以解释为什么会在JavaScript中发生这种情况吗?为什么这些价值?在其他浏览器,移动设备和操作系统中,它会受到同样的影响吗?
答案 0 :(得分:1)
有人可以解释为什么会在JavaScript中发生这种情况吗?
它不仅仅是JavaScript,几乎所有的编程语言都使用相同的底层机制("两个补充")作为整数类型。这是两个补语整数的一个特征:当你超出范围时,你就会环绕。 Int32Array
是一个32位二进制补码整数数组。 (而JavaScript的正常数字类型不是;它是IEEE-754双精度二进制浮点数。)
让我们看一下2147483647:
的位01111111 11111111 11111111 11111111
当你加1时,你得到
10000000 00000000 00000000 00000000
...这是-2147483648。当然,如果再次拿走1,你会得到原版(2147483647)。
更多关于维基百科here的两个补充。
为什么要这些价值?
因为使用带符号的32位整数,这是可用范围。 -2 32 至2 32 -1,包括端值。如果你使用的是Int8Array
,则范围是-128(-2 8 )到127(2 8 -1)。
在其他浏览器,移动设备和操作系统中,它会受到同样的影响吗?
是。如果他们没有,他们将无法正确实施Int32Array
。