予期しない動作: Java バイト変換の問い合わせ
Java では、int がバイトに変換されると、予期しない結果が -124 になります。次のコード スニペットは眉をひそめています:
int i = 132; byte b = (byte)i; System.out.println(b);
謎の解明
この謎を解明するには、Java のプリミティブ データ型の複雑さを掘り下げる必要があります。 。 32 ビットにわたる整数と 8 ビットにわたるバイトでは、記憶容量が異なります。バイトを含むほとんどのプリミティブ型は符号付きです。つまり、2 の補数エンコーディングを使用して正の値と負の値の両方を表します。
符号ビット優位
2 の補数では、最も有効ビット (MSB) によって符号が決まります。バイトを int に変換する場合、MSB は新しい MSB 全体に複製されます。したがって、8 ビットのバイト 255 (11111111) は、32 ビットの int 11111111111111111111111101010101 になります。
負の値の欺瞞
負の 2 の補数の解釈には、最初のMSB左から右へ、後続のすべてのビットを反転します。上記の 255 の int 表現の場合、00000000000000000000000001111111 = -1 となります。これは、Java が符号付き値 132 である -124 を表示する理由を説明しています。
符号なしの真実を明らかにする
バイトの符号なし値を明らかにするために、ビットマスク ( 0xff) は、最下位 8 ビットを分離し、余分な符号ビットを削除します。このマスキング操作をバイト signedByte = -1 に適用すると、符号なし値 unsignedByte = 255 が生成されます。
Bitwise Magic
ビットごとの AND により、不要な符号ビットがマスクされます。 int がバイトにキャストされると、Java は上位 24 ビットを破棄します。マスキングにより、符号ビットが 0 になっているため、残りの 8 ビットが Java によって正の値として解釈されるようになります。
バイトの陰謀のマスクを解除する
この動作は次の点を強調します。数値の符号付き表現と符号なし表現の重要な違いと、データ型変換中に行われるビットレベルの演算です。これらの原則を理解することで、Java におけるバイト変換のパズルを解読し、予期しない結果を回避することができます。
以上がJava で「int」を「byte」にキャストすると、予期しない否定的な結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。