2

JavaScript でのビット単位の操作がどのように機能するか、より具体的には、ビット単位の操作の結果として得られる 32 ビットの数値が 64 ビットの JavaScript の数値に変換される方法を理解しようとしています。32 ビット数値の左端のビットを設定し、演算がオーバーフローすると、奇妙な結果が得られます。

たとえば、次の操作を行います。

0x01 << 31

0x80000000数値が 32 ビット長の場合、通常は次のようになります。しかし、JavaScript がこの数値を 64 ビット値に戻すと、左端の 32 ビットがパディング1されて、値が になりますFFFFFFFF80000000

同様に、32 ビットを左にシフトすると、次の操作で 32 ビット整数がオーバーフローします。

0x02 << 32

数値はオーバーフローし、結果の値は になります0x00。しかし、結果の JavaScript 番号は0x02です。

JavaScript がビット単位の操作に使用する、私が認識していない特定のルールはありますか? すべてのビット演算は 32 ビット整数で実行され、JavaScript の数値は 64 ビットの倍精度浮動小数点数であることは理解していますが、2 つの間の変換時に余分なパディングがどこから来るのか理解できません。

4

2 に答える 2

1
  1. ビット単位の演算子の結果は符号付きint32 であり、数値に変換されるときに符号ビットが伝播されます。

  2. 31 ビットを超えてシフトすることはできません。

shiftCount を、rnum の最下位 5 ビットを除くすべてをマスクした結果、つまり、rnum & 0x1F を計算した結果とします。

つまり、x<<32と同じx<<0です。

于 2013-03-20T07:33:38.597 に答える