Int と Byte 変換の興味深い異常
Java で int をバイトに変換するとき、特に見かけの要素を考慮した場合、動作が予期しないように見えることがあります。データの損失と、結果のバイトに割り当てられる負符号。この謎を解明するために、プリミティブ データ型と 2 の補数表現の複雑さを掘り下げてみましょう。
プリミティブ型と 2 の補数について理解する:
Java では、int が占有します。 32 ビットですが、1 バイトが占めるのはわずか 8 ビットです。さらに、int や byte などのプリミティブ型は 2 の補数表現に従います。このスキームでは、最上位ビット (MSB) が符号を決定し、追加ビットによってその複製が行われます。
Int から Byte へのビット単位の変換:
int をバイトに変換すると、Java は最下位 8 ビットのみを抽出し、それに応じて値を割り当てます。ただし、バイトの符号ビットである int の MSB は、結果に重要な役割を果たします。
隠された真実を明らかにする:
複雑な例:
int i = 132; byte b = (byte)i; // Implicit narrowing conversion System.out.println(b); // Prints -124
の 32 ビット バイナリ表現132:
00000000000000000000000010000100
最下位 8 ビットの抽出 (10000100):
10000100
2 の補数表現への変換:
11111000
Java はこれを次のように解釈します。ビットパターンが反転しているため負の値となり、-124 となります。
エニグマの解決:
バイトの元の 8 ビット符号なし値を取得するには、ビットごとの AND 演算を実行できます:
byte signedByte = -124; int unsignedByte = signedByte & 0xff; // 0xff = 11111111b
この操作により無関係な符号ビットがマスクされ、次の結果が得られます。 result:
Unsigned value: 10000100 (84 in decimal)
トリックの要約:
整数からバイトへの変換中、Java は暗黙的な縮小によって左端の 24 ビットを無視します。符号ビットは、もともと int の 8 番目のビットでしたが、バイトの MSB となり、その解釈に影響を与えます。符号なしの値を明らかにするには、ビット単位の AND 演算が必要であり、符号ビットを効果的に消去します。
以上がJava で int を byte に変換すると負の値になるのはなぜですか?また、元の符号なしの値を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。