Java の不可解な整数からバイトへの変換: 符号なし値を理解する
開発者は Java のプリミティブ型を扱う際に、興味深い問題に頻繁に遭遇します。整数 (int) をバイト (byte) に変換するときの動作。以下のコード スニペットに示されているように、正の整数をバイトにキャストすると、予期せず、一見誤った負の値が返されます。
この単純なコードの出力が、予想される 132 ではなく -124 になるのはなぜですか?この謎を解明するために、Java のプリミティブ型の複雑さと、符号付き値と符号なし値の内部表現を詳しく調べます。
Java の符号付き型と符号なし型を理解する
Java の int、byte、short、long などのプリミティブ型は符号付きです。つまり、正の値と負の値の両方を表すことができます。これらの型は 2 の補数表記を利用し、最上位ビット (MSB) が数値の符号を決定します。 MSB が 0 の場合、数値は正です。
ビット単位 AND
の役割 混乱を解決し、バイトの真の符号なし値を明らかにするために、ビット単位の演算を使用します。具体的には、ビットごとの AND 演算子 (「&」) を、通常は 0xff で表されるビットマスクとともに利用します。ビットマスクは、整数の下位 8 ビットのみが保持されるようにし、符号ビットを効果的に削除します。
上位ビットをマスクすることで、バイトの元の符号なし値を分離し、それが元の符号なしの値であることを明らかにします。確かに正の値 (この場合は 255) です。
変換の影響
Java が int をバイトに変換するとき、左端の 24 ビットが切り捨てられます。下位8ビットのみ。これらの残りのビットの解釈は、符号ビットの存在によって異なります。符号ビットが 1 (負) の場合、Java は値が負であるとみなし、残りの 7 ビットを反転します。ただし、符号ビットが 0 (正) の場合、残りのビットは符号なしの値として読み取られます。
結論
Java のプリミティブ型の符号付きの性質を理解することでビットマスクの役割を理解することで、int をバイトに変換するときに観察される一見奇妙な動作をわかりやすく説明できます。この知識により、開発者はデータを正確に操作および解釈できるようになり、Java コードが意図したとおりに実行されるようになります。
以上がJava の int から byte への変換で予期しない負の値が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。