JavaScript整数移位安全性:(n <&lt; 1)!=(n * 2)

时间:2017-02-14 08:41:30

标签: javascript integer integer-overflow

挖掘JS刚发现了一些新东西:

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

这是内置FireFox(51.0.1 64位)调试器的控制台输出......

到目前为止我所读过的内容(w3school等),不允许我怀疑这种行为。

没问题还是错过了什么?

...To be continued...

3 个答案:

答案 0 :(得分:2)

n << b handles n and the result as int 32,而n * 2 handles n and the 2number

请注意4294967295 << 0-1

答案 1 :(得分:0)

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

答案 2 :(得分:0)

第一条评论回答了这个问题:按位运算是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)

即。至少80位可用......他 - 他!

你很快就会得到一个“不可变数字”!

n=0xffffffffffffffff // 64-bit wanted
18446744073709552000 // what? even decimal for odd hex?
n.toString(16)
"10000000000000000" // ooops...
n-1
18446744073709552000
n-2
18446744073709552000
n-4
18446744073709552000

看起来它应该是一个单独的问题......