一个java面试题 碰到一个java面试题,题目如下System.out.println((int)(char)(byte)-1);请问输出结果为什么是65535 ? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 -1 .二进制表示: 1111 1111转char 符号位拓展: 1111 1111 1111 1111转int 65535。 请问楼上的,为什么转char 符号位拓展: 1111 1111 1111 1111呢?转int就是65535了,麻烦讲详细点?谢谢 Apeipo 高手 真没见过这样的问题 这是有符类型和无符类型的区别有符类型,低字节数转换成高字节数时,符号位往前扩展无符类型转换,因为没有符号位一说,所以符号位不往前扩展java里,byte,short,int,long是有符的,char是无符的所以(char)(byte)-1,byte向char转换时,因为byte有符,所以符号位扩展而(int)(char),即char向int转换时,因为char无符,所以符号位不扩展看个例子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); public abstract class openingCeremony { protected abstract void raiseFlag(); protected abstract void swearOfReferee(); protected abstract void swearOfAthlete(); protected abstract void announce(); public void start(){ raiseFlag(); swearOfReferee(); swearOfAthlete(); announce(); }} System.out.println((int)(char)-1);这样,也是65535结果很显然,就是把char类型的2进制-1转化为了int类型的。由二进制的编码。即可得65535 -1-> (byte有正负) 11111111 -> (char只有正数)是负数扩展符号位1 但变为正数 1111111111111111 -> (int有正负)是正数扩展符号位0 0000000000000000 1111111111111111 = 如何运行远程计算机上的一个程序? 集合分组后输出 在线急等…… 请问 java应用程序占用内存超大,这是出了什么问题? 困扰我一下午的webwork问题,高手赐教!! 请问客户端写入对象成功服务器却收不到是什么原因? 一个奇怪的问题 解决了都有分 一个问题,总也想不通??? 请问怎么样用java来操作,DOC和EXCEL文件? 我的类参数传递,错在哪儿? BufferIO的问题 JDBC断开与数据库的交互
转char 符号位拓展: 1111 1111 1111 1111
转int 65535。
转int就是65535了,麻烦讲详细点?谢谢
有符类型,低字节数转换成高字节数时,符号位往前扩展
无符类型转换,因为没有符号位一说,所以符号位不往前扩展
java里,byte,short,int,long是有符的,char是无符的
所以
(char)(byte)-1,byte向char转换时,因为byte有符,所以符号位扩展
而(int)(char),即char向int转换时,因为char无符,所以符号位不扩展看个例子
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);
protected abstract void raiseFlag();
protected abstract void swearOfReferee();
protected abstract void swearOfAthlete();
protected abstract void announce();
public void start(){
raiseFlag();
swearOfReferee();
swearOfAthlete();
announce();
}
}
结果很显然,就是把char类型的2进制-1转化为了int类型的。
由二进制的编码。即可得65535
-> (byte有正负) 11111111
-> (char只有正数)是负数扩展符号位1 但变为正数 1111111111111111
-> (int有正负)是正数扩展符号位0 0000000000000000 1111111111111111
=