Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.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 换档安全:(n<;<;1)!=(n*2)_Javascript_Integer_Integer Overflow - Fatal编程技术网

Javascript 换档安全:(n<;<;1)!=(n*2)

Javascript 换档安全:(n<;<;1)!=(n*2),javascript,integer,integer-overflow,Javascript,Integer,Integer Overflow,我刚刚发现了一些新的东西: n = 0xffffffff 4294967295 n 4294967295 n << 1 -2 n * 2 8589934590 (n << 1) == (n * 2) false n + 1 4294967296 n=0xffffffff 4294967295 N 4294967295 在javascript中,右移位运算符或左移位运算符仅支持32位。2^32-1=4294967295。在javascript中,右移位运算符或左移位运算符

我刚刚发现了一些新的东西:

n = 0xffffffff
4294967295
n
4294967295
n << 1
-2
n * 2
8589934590
(n << 1) == (n * 2)
false
n + 1
4294967296
n=0xffffffff
4294967295
N
4294967295

在javascript中,右移位运算符或左移位运算符仅支持32位。2^32-1=4294967295。

在javascript中,右移位运算符或左移位运算符仅支持32位。2^32-1=4294967295。

第一条评论回答了这个问题:按位运算是32位有符号的

数学看起来要长得多:

var n = 0xffffffff;
// loop over 1P:
for(var i=1; i<=1024*1024*1024*1024; i*=16) {
    var v=(n*i).toString(16);
    console.log('i='+i+'; v='+v+' ('+v.length*4+')');
}
// Output:
// i=1; v=ffffffff (32) 
// i=16; v=ffffffff0 (36) 
// i=256; v=ffffffff00 (40) 
// i=4096; v=ffffffff000 (44) 
// i=65536; v=ffffffff0000 (48) 
// i=1048576; v=ffffffff00000 (52) 
// i=16777216; v=ffffffff000000 (56) 
// i=268435456; v=ffffffff0000000 (60) 
// i=4294967296; v=ffffffff00000000 (64) 
// i=68719476736; v=ffffffff000000000 (68) 
// i=1099511627776; v=ffffffff0000000000 (72)
// i=17592186044416; v=ffffffff00000000000 (76) 
// i=281474976710656; v=ffffffff000000000000 (80)

看起来这应该是一个单独的问题……

第一条评论回答了这个问题:按位操作是32位有符号的

数学看起来要长得多:

var n = 0xffffffff;
// loop over 1P:
for(var i=1; i<=1024*1024*1024*1024; i*=16) {
    var v=(n*i).toString(16);
    console.log('i='+i+'; v='+v+' ('+v.length*4+')');
}
// Output:
// i=1; v=ffffffff (32) 
// i=16; v=ffffffff0 (36) 
// i=256; v=ffffffff00 (40) 
// i=4096; v=ffffffff000 (44) 
// i=65536; v=ffffffff0000 (48) 
// i=1048576; v=ffffffff00000 (52) 
// i=16777216; v=ffffffff000000 (56) 
// i=268435456; v=ffffffff0000000 (60) 
// i=4294967296; v=ffffffff00000000 (64) 
// i=68719476736; v=ffffffff000000000 (68) 
// i=1099511627776; v=ffffffff0000000000 (72)
// i=17592186044416; v=ffffffff00000000000 (76) 
// i=281474976710656; v=ffffffff000000000000 (80)
看起来这应该是一个单独的问题…

位运算符(>>>>>|等)限制为(有符号)32位位运算符(>>>>|等)限制为(有符号)32位