Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 整数溢出为负数_Javascript_Arrays - Fatal编程技术网

Javascript 整数溢出为负数

Javascript 整数溢出为负数,javascript,arrays,Javascript,Arrays,根据这一点,我了解到在IE8中,如果创建的数组的索引大于2147483647,则新元素的索引将是负数 还有这个例子: function test() { var arr = new Array(); arr[2147483650] = 10000; arr.push(10); document.write(arr["-2147483645"] == 10); } test(); 我不理解的是,为什么数组中新添加的元素的索引是-

根据这一点,我了解到在IE8中,如果创建的数组的索引大于2147483647,则新元素的索引将是负数

还有这个例子:

function test() { 
    var arr = new Array();         
    arr[2147483650] = 10000; 
    arr.push(10);     
    document.write(arr["-2147483645"] == 10); 
} 
test();

我不理解的是,为什么数组中新添加的元素的索引是
-2147483645
,我理解负部分,我只是不知道如何知道新索引是
2147483645
,而不是
-2147483644
-2147483651

在您的示例中,我想指出的是,未创建
-2147483645
索引,而是将数组转换为对象:

function test() { 
    var arr = new Array();         
    arr[2147483650] = 10000; 
    arr.push(10);     
    console.log(arr["-2147483645"] == 10); 
    console.log(arr)
} 
test();

// false
// [2147483650: 10000, 2147483651: 10]
我不明白的是,为什么数组中新添加的元素的索引为-2147483645

需要注意的是,JavaScript中的所有内容都是隐藏的对象。话虽如此,即使是
数组
实际上也只是一个对象。在本例中,您的数组实际上没有
-2147483645
的索引,实际上没有发生整数溢出而是将溢出的整数转换为字符串,并成为映射到数组对象中的值的键

var arr = [];
arr[2147483650] = 'foo';

// The index is really just converted to a string behind the scenes
console.log(arr[2147483650] === arr["2147483650"]);

// true
如果您尝试使用超出范围的整数对数组进行索引,它将假定您正在创建一个对象并创建一个对象,而不是对数组进行索引

var arr = [];
arr[0] = 'foo';
console.log(arr);
// ["foo"]
// Has the array notation

var arr = [];
arr[2147483650] = 'bar';
console.log(arr);
// [2147483650: "bar"]
// Notice the object notation?

当以32位表示数字时,最高位用作符号位,因此当以二进制表示2147483647之类的数字时,它是

01111...111
那里有31个1。当我们再加上一个,我们得到

10000...000
那里有31个0。因此,我们将符号位转换为一个表示负数的位。但是,由于需要避免两次表示0,我们将数字包装起来,因此不表示-0,而是表示负数2147483648(不是2147483647,因为正数需要表示0,但负数不需要表示,因此我们得到一个“额外”负数)

每次我们加上一个,它就会增加二进制表示,通过负数倒计时

1000...00 = -2147483648 // this is 2147483648
1000...01 = -2147483647 // this is 2147483649
1000...10 = -2147483646 // this is 2147483650
等等。因此,2147483650被包装为-2147483646,因此,多出一个被设置为-2147483645


有关详细信息,请参阅。

谢谢您的回答,但这并不能回答我的问题。@N2MH Matthew对整数溢出的工作原理进行了很好的解释,但在使用JavaScript编程时,不要忘记,如果索引溢出,数组值可以转换为对象!祝你好运!非常感谢你的解释