碰到一个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
=