JavaScript 整数移位安全:(n << 1) != (n * 2)
JavaScript integer shift safety: (n << 1) != (n * 2)
挖掘 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 等)不允许我怀疑这种行为。
没问题还是我漏了什么?
n << b
handles n
and the result as int 32, whereas n * 2
handles n
and the 2
as number.
请注意 4294967295 << 0
将是 -1
。
在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)
即至少有 80 位可用... He-he!
你很快就会得到 "immutable number"!
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
看来应该是一个单独的问题...
挖掘 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 等)不允许我怀疑这种行为。
没问题还是我漏了什么?
n << b
handles n
and the result as int 32, whereas n * 2
handles n
and the 2
as number.
请注意 4294967295 << 0
将是 -1
。
在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)
即至少有 80 位可用... He-he!
你很快就会得到 "immutable number"!
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
看来应该是一个单独的问题...