ホームページ  >  記事  >  Java  >  Java で int を byte に変換すると負の値になるのはなぜですか?また、元の符号なしの値を取得するにはどうすればよいですか?

Java で int を byte に変換すると負の値になるのはなぜですか?また、元の符号なしの値を取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-09 09:10:02872ブラウズ

Why does converting an int to a byte in Java result in a negative value, and how can we retrieve the original unsigned value?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。