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位