2017-02-14 9 views
0

Копаем JS только что открыл что-то новое для меня:JavaScript безопасности целочисленный сдвиг: (п << 1) = (п * 2)

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...

+5

битовые операторы (<< >> >>> | и т.д.) ограничены (подпись) 32bit –

ответ

0

В javascript оператор сдвига вправо или оператор сдвига влево поддерживают только 32 бит. 2^32 - 1 = 4294967295.

0

... Первый комментарий на вопрос: Побитовый ops - это 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 

Похоже, это должен быть отдельный вопрос ...

Смежные вопросы