日期:2014-05-20  浏览次数:20785 次

一个java面试题
碰到一个java面试题,题目如下
System.out.println((int)(char)(byte)-1);
请问输出结果为什么是65535 ?

------解决方案--------------------
-1 .二进制表示: 1111 1111
转char 符号位拓展: 1111 1111 1111 1111
转int 65535。
------解决方案--------------------
这是有符类型和无符类型的区别
有符类型,低字节数转换成高字节数时,符号位往前扩展
无符类型转换,因为没有符号位一说,所以符号位不往前扩展
java里,byte,short,int,long是有符的,char是无符的
所以
(char)(byte)-1,byte向char转换时,因为byte有符,所以符号位扩展
而(int)(char),即char向int转换时,因为char无符,所以符号位不扩展

看个例子
Java code
int a = -1;
byte b = (byte)a;
char c = (char)a;
System.out.printf("a=%d, b=%d, c=%d, (int)b=%d, (int)c=%d\n", 
                  a, b, (int)c, (int)b, (int)c);
//可见 (int)b还是==-1,但是(int)c就不再是-1了,也就是char向高字节int转换时,
//符号位不扩展(因为char是无符,也就是没有符号位之说,所以也就没有符号位扩展),
//而byte有符,所以符号位扩展

至于每个类型是否有符,可以查看其最大值最小值
System.out.printf("byte-min:%d, byte-max:%d, char-min:%d, char-max:%d, int-min:%d, int-max:%d\n",
                  Byte.MIN_VALUE, Byte.MAX_VALUE, 
                  (int)Character.MIN_VALUE, (int)Character.MAX_VALUE, 
                  Integer.MIN_VALUE, Integer.MAX_VALUE);

------解决方案--------------------
-1
-> (byte有正负) 11111111 
-> (char只有正数)是负数扩展符号位1 但变为正数 1111111111111111
-> (int有正负)是正数扩展符号位0 0000000000000000 1111111111111111
=