JavaScript では、すべての整数変数はデフォルトで符号付き整数になります。これは何を意味しますか?
符号付き整数は 31 ビットを使用して整数の値を表し、ビット 32 で整数の符号を表します。0 は正の数を表し、1 は負の数を表します。
値の範囲は -2^31 ~ 2^31-1、つまり -2147483648 ~ 2147483647 です。
JavaScript がビット演算を実行する場合、32 ビットの符号付き整数型が使用されます。これは、変換の結果も 32 ビットの符号付き整数型であることを意味します。 シフトを実行すると予期しない結果が発生する場合があります。以下に C 言語と JS の比較を示します。
C言語
次のようにコードをコピーします。
unsigned int a = 3774191835u;
unsigned int b = a >> 2;
/* b == 943547958 */
JavaScript
次のようにコードをコピーします。
var a = 3774191835;
var b = a >> 2;
/* b == -130193866 */
ご覧のとおり、JavaScript はビット演算を実行するときに符号付き整数を使用するため、異なる結果が得られます。 どうやって解決すればいいでしょうか?
JavaScript の符号付き数値を符号なし数値に変換できます。 >>>0 シフト操作を行うだけです。
数値がオーバーフローすると、左端のビットが符号ビットとして解析されるため、>> を使用しないことをお勧めします。