ビット処理演算子による型の強制変換
このバージョンの JScript のビット処理演算子は、以前のバージョンの JScript のビット処理演算子と完全な互換性を維持しています。 また、JScript の演算子は新しい数値データ型に対しても使用できます。 ビット処理演算子の動作は、データのバイナリ表現に依存します。したがって、演算子がデータの型を強制変換する方法を理解することが重要です。
ビット処理演算子には、事前バインディングされた変数、遅延バインディングされた変数、およびリテラル データの、3 種類の引数を渡すことができます。 事前バインディングされた変数は、明示的な型の注釈を使って定義された変数です。 遅延バインディングされた変数は、数値データを含む Object 型の変数です。
ビットごとの AND (&)、OR (|)、および XOR (^) 演算子
いずれかのオペランドが遅延バインディングされている場合、または両方のオペランドがリテラルの場合は、どちらのオペランドも int (System.Int32) に強制変換され、演算の戻り値は int になります。
両方のオペランドが事前バインディングされている場合、または一方のオペランドがリテラルで他方が事前バインディングされている場合は、さらに手順が必要です。 どちらのオペランドも、2 つの条件で決定される型に強制変換されます。
どちらのオペランドも整数でない場合は、両方とも int に強制変換されます。
いずれか一方のオペランドだけが整数の場合、整数でないオペランドは、整数型と int のうち長い方の型に強制変換されます。
いずれかのオペランドの方が長い場合、オペランドの変換先の型は、長い方のオペランドと同じ長さになります。
どちらのオペランドも符号なしである場合、オペランドは符号なしの型に強制変換されます。 それ以外の場合は、符号付きの型に変換されます。
次に、オペランドは適切な型に強制変換され、ビット処理演算子が実行されて結果が返されます。 演算結果のデータ型は、強制変換されたオペランドのデータ型と同じになります。
整数リテラルをビット処理演算子および事前バインディングされた変数と使用する場合、リテラルは、int、long、ulong、または double として解釈されます。解釈は、数値を表すことができる最小の型によって決まります。 リテラルの decimal 値は、double に強制変換されます。 リテラルのデータ型は、上記の規則に従って、さらに強制変換されることがあります。
ビットごとの NOT 演算子 (~)
オペランドが遅延バインディングされている場合、浮動小数点数である場合、またはリテラルである場合、オペランドは int (System.Int32) に変換され、NOT 演算の戻り値は int になります。
オペランドが事前バインディングされた整数型である場合、NOT 演算の戻り値の型はオペランドの型と同じになります。
ビットごとの左シフト演算子 (<<) および右シフト演算子 (>>)
左オペランドが遅延バインディングされている場合、浮動小数点数である場合、またはリテラルである場合、オペランドは int (System.Int32) に強制変換されます。 それ以外の場合、左オペランドは事前バインディングされた整数型であり、型の強制変換は実行されません。 右オペランドは、常に整数型に強制変換されます。 次に、強制変換された値に対してシフト演算が実行されます。戻り値の型は、左オペランドと同じか (事前バインディングされている場合)、または int 型になります。
符号なし右シフト演算子 (>>>)
左オペランドが遅延バインディングされている場合、浮動小数点数である場合、またはリテラルである場合、オペランドは uint (System.UInt32) に強制変換されます。 それ以外の場合、左オペランドは事前バインディングされた整数型であり、符号なしの同じ型に強制変換されます。 たとえば、int は uint に強制変換されます。 右オペランドは、常に整数型に強制変換されます。 次に、強制変換された値に対してシフト演算が実行されます。戻り値の型は、強制変換された左オペランドと同じか (事前バインディングされている場合)、または uint 型になります。
符号なし右シフト演算の結果は、常に、オーバーフローすることなく、戻り値の型の符号付きの型に格納できます。