次のNode.js REPLの出力を見てください:予想通り予期しない右シフト演算の挙動
> n=10
10
> console.log(n.toString(2)); //ok ?
1010
undefined
> m=n>>1
5
> console.log(m.toString(2)); //cool :)
101
これが働いています。ここを見てください:
> n=Number.MAX_VALUE
1.7976931348623157e+308
> m=n>>1
0
> n.toString(16) // to read easier
'fffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
> m.toString(16) // to read easier
'0'
ここで何が起こったのですか?私は右に1桁
fffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
をシフトすべきではない私が代わりにゼロを取得しましたか
7ffffffffffffc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
を与えますか?
また、V8/Nodeの問題だけではないことに気付きました。私はFirebugで同じ結果を得ます。
あなたは['Number.MAX_SAFE_INTEGER'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)と思っています –
@HunterMcMillen実際には、その範囲は53ビットですが、ビット操作は32ビットでのみ機能します – Alnitak