元のタイプの変換を拡張して狭める

1831 ワード

元のタイプの変換、すなわちwidening and narrowing primitive conversionを拡張して狭める
byte回転charプロセスは、元のタイプの変換を広げ、狭めることである.byteはintに変換され、このintはcharに変換される.
 
 
		System.out.println((int)(char)((byte)(int)-1)); //65535
		System.out.println((int)(char)(byte)(-1&0xff)); //65535
		System.out.println((int)(char)(-1&0xff));  //255
		System.out.println((int)(short)(char)((byte)(int)-1));  //-1
		//  
		System.out.println(Integer.toBinaryString(-1)); //11111111111111111111111111111111
		BigInteger src = new BigInteger("ff",16); // , 10 ,2 ,16 
		System.out.println(src.toString()); //255
		//char   int
		char x = (char)((byte)(int)-1);
		int m = x;
		System.out.println(m); //65535
		int n = (short)x;
		System.out.println(n); //-1

 
変換プロセス:
1.intタイプ-1定数をbyte、すなわち0 xffに変換
2.byteはcharを回し、2つのステップを実行します.
1)byte回転int、すなわち0 xffffffff;
2)charに再変換し、高2バイト、0 xffffを遮断する.
3.intに変換すると65536が表示される
 
ここでは、狭い整形データから広い整形データへの変換規則、すなわち、最初の数値タイプがシンボルである場合、シンボル拡張を実行する比較的重要な変換規則に関する.charの場合、どのタイプに変換されるかにかかわらず、ゼロ拡張が実行されます.
 
byteからcharへの拡張プロセス:
1.シンボル拡張が発生しない場合
byte b = -1;
char c = (char)(b & 0xff);//すなわちbは当初のシンボルタイプのbyteではなく、以下と比較する.
 
2.シンボル拡張が発生する場合
byte b = -1;
char c = (char) b;//すなわちchar c=(char)(byte)bに等価である.すなわち、bにはシンボルタイプがある.
 
 
char回転int拡張プロセス:
1.シンボル拡張が発生しない場合:
int i=c&0 xffffまたはint i=c;//char自体は符号なしなので、ビット演算を行わなくてもいいです.
 
2.シンボル拡張を行うには:
int i = (short) c;//シンボル付きshortに変換してからintに変換します. 
 
 
 
奥行き:http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html