ホームページ > Java > &#&チュートリアル > Java で「int」を「byte」にキャストすると、予期しない否定的な結果が生じるのはなぜですか?

Java で「int」を「byte」にキャストすると、予期しない否定的な結果が生じるのはなぜですか?

DDD
リリース: 2024-11-15 08:42:02
オリジナル
1091 人が閲覧しました

Why does casting an `int` to a `byte` in Java lead to an unexpected negative result?

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート