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 つの間の変換時に余分なパディングがどこから来るのか理解できません。