拓宽并窄化原始类型的转换即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, 即0xff
2. byte转char,执行两步:
1) 先byte转int, 即0xffffffff;
2) 再转换成char,截断高2个字节,0xffff;
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 & 0xffff 或者 int i = c; // 由于char本身是无符号的,所以可以不进行位运算;
2. 希望发生符号拓展:
int i = (short) c; //先转成有符号的short,再转成int;
深入:http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html