2017-02-14 99 views
0

挖JS剛剛發現了一些新的東西給我!的JavaScript整數移位的安全性:(N << 1)=(N * 2)

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

這是火狐內建的控制檯輸出(51.0.1 64-位)調試器...

我迄今(w3school等閱讀),不允許我懷疑這樣的行爲。

它是確定或有我錯過了什麼?

...To be continued...

+5

位運算符(<< >> >>> |&等)僅限於(簽字)32位 –

回答

0

在JavaScript中,向右移位運算符或向左移位運算符只支持32位。 2^32 - 1 = 4294967295.

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 

看起來這應該是一個獨立的問題...

相關問題