2016-04-19 4 views
0

次の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で同じ結果を得ます。

+0

あなたは['Number.MAX_SAFE_INTEGER'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)と思っています –

+0

@HunterMcMillen実際には、その範囲は53ビットですが、ビット操作は32ビットでのみ機能します – Alnitak

答えて

1

x >> yを計算すると、xは符号付き32ビット整数に変換されます。次に、それはy位だけ右にシフトされます。

もの最下位32ビットであるので、あなたの値0xfffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000が0x00000000のに変換されます。これを右にシフトするとゼロになります。

+0

ああ!今は完璧な意味があります。 – anu

2

JavaScriptのビットレベル演算は、32ビットの符号付き値(ゼロ拡張の演算子の場合は符号なし)に対してのみ機能します。これらの32ビットを超えるものは、ビット操作が行われる前にゼロに設定されます。

関連する問題