2

short/char のサイズが両方とも 16 ビットであっても、この明示的な変換が異なる結果をもたらす理由を誰か教えてもらえますか?

package jh;

public class Main {

  public static void main(String[] args) {

     byte b = (byte)255;

     System.out.println("Size of short: " + Short.SIZE);
     System.out.println("Size of char: " + Character.SIZE);

     System.out.println((int)((short)b));
     System.out.println((int)((char)b));        
   }
 }

出力:

Size of short: 16
Size of char: 16
-1
65535
4

3 に答える 3

4

Javaデータ型ドキュメントから

byte: byte データ型は、8 ビットの符号付き 2 の補数整数です。最小値は-128 で、最大値は 127 (両端を含む)です。バイト データ型は、メモリの節約が実際に重要な大きな配列でメモリを節約するのに役立ちます。これらは、制限がコードを明確にするのに役立つ int の代わりに使用することもできます。変数の範囲が制限されているという事実は、ドキュメントの形式として役立ちます。

short: short データ型は、16 ビットの符号付き 2 の補数の整数です。最小値は-32,768 で、最大値は 32,767 (両端を含む)です。バイトと同様に、同じガイドラインが適用されます。メモリの節約が実際に重要な状況では、ショートを使用して大きな配列でメモリを節約できます。

char: char データ型は、単一の 16 ビット Unicode 文字です。最小値は'\u0000' (または 0) で、最大値は '\uffff' (または 65,535 を含む)です。

つまり、要するに(しゃれを許してください)、ビットごとに同じです。ただし、 と同じビット パターンに対してchar異なる数値shortを表します。

これには、符号拡張機能も伴います。(byte) 255は、すべてのビットが設定されたバイト値 ( ) を意味し、2 の補数0b11111111で -1 になります。上方に変換する場合、Java は符号拡張操作を行うため、符号ビットが 0 の場合は上位ビットもすべて 0 になりますが、符号ビットが 1 の場合は上位ビットもすべて 1 になります。これは、-1 がすべての符号付き整数データ型 (この例ではfor )で -1 を意味することを意味します。しかし、char ではありません。すべてのビットが設定されている場合、正の最大値である 65535 に等しくなります。0b1111111111111111short

于 2013-09-18T10:55:07.357 に答える
3

byte署名され、値のみを保持します-128..127。255 を割り当てると、ラップアラウンドして になり-1ます。

(short)bです-1

charただし、Java で唯一の符号なし型であり、値0..65535を持っているため(char)-1、再びラップアラウンドして になり65535ます。

于 2013-09-18T10:58:25.347 に答える
0

byte b = (byte)255;が署名されているbため、値 -1 が割り当てられます。byte-1 をキャストすると、-1shortを取得します。-1 をキャストするとchar、 の範囲がchar0 から 65535 の間にあるため、65535 が得られます。

于 2013-09-18T10:57:36.737 に答える