Java の整数からバイトへの変換での予期しない動作
Java で整数 (int) をバイト (byte) に変換するとき、予期せぬ結果が生じる可能性があります。次のコードを考えてみましょう:
int i = 132; byte b = (byte) i; System.out.println(b);
驚くべきことに、出力は 132 ではなく -124 です。その理由を理解するには、Java のプリミティブ型の内部表現を詳しく調べる必要があります。
符号付き数値と 2 の補数
Java では、int は 32 ビット符号付きです。整数、バイトは 8 ビット符号付き整数です。符号付き整数は、2 の補数表記を使用して正の値と負の値の両方を表すことができます。この表記法では、左端のビット (MSB) が数値の符号を決定し、0 は正を示し、1 は負を示します。
Int から Byte への変換
の場合int から byte に変換する際、Java は符号ビットを保持し、残りの 24 ビットを破棄します。これは、int 値が正の場合、結果のバイト値も正になることを意味します。ただし、この例のように int 値が負の場合、結果のバイト値は負に表示されます。
2 の補数反転
この負の動作を理解するには、次のようにします。 2 の補数反転プロセスを考慮する必要があります。負の数を表すには、2 の補数ですべてのビットを反転し、結果に 1 を加えます。この場合、int 値 132 はバイナリで 10000100 です。ビットを反転して 1 を追加すると、01111011 が得られます。これは、10 進表記では -124 です。
符号なしバイト値
この例では、通常、バイト値は次のようになると予想されます。符号なしの場合、-124 ではなく正の値 132 が得られます。バイトから符号なしの値を取得するには、符号ビットを削除し、下位 8 ビットのみを抽出するビットマスクを適用できます。
byte signedByte = -124; int unsignedByte = signedByte & 0xff; System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte);
これにより、「Signed: -124 Unsigned: 132」が出力されます。必要な符号なしの値を指定してください。
以上がJava の整数からバイトへの変換の結果が負の値になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。