黑马程序员技术交流社区

标题: [已解决]关于类型转换的问题 [打印本页]

作者: 胡宝林    时间: 2012-6-3 14:14
标题: [已解决]关于类型转换的问题
本帖最后由 hy19985125 于 2012-6-4 10:54 编辑

public class A {
public static void main(String[] args) {
     System.out.println((int)(char)-1);
}
}
-1是int类型的,先将他强转为char类型,在转回int类型,打印的结果应该还是-1,但是打印的结果却是65535

求高手解答!!!!
作者: 黑马张扬    时间: 2012-6-3 14:28
本帖最后由 黑马张扬 于 2012-6-3 14:35 编辑


实心箭头表示无信息丢失的转换   虚心箭头表示可能会有精度丢失  

int转char的情况 一般不建议使用  因为 int为4个字节,char为2个字节,强行转换很大可能会丢失2个高位字节的数据 所以才得不到你想要的结果

作者: 张亭    时间: 2012-6-3 14:31
int类型在java中用32位二进制补码形式表示:
int -1 为  11111111111111111111111111111111(32个1)
char 在java中占2个字节(16位),
-1转换为char型为:1111111111111111(16个1)
再转为int类型,前面补上16个0,变为:00000000000000001111111111111111(16个0,16个1)
换成10进制为65535

基础的东西,好好看下视频吧,亲
作者: 田建    时间: 2012-6-3 14:37
在ASCII码里,是从0--127的,-1是没有对应的字符的,因而你将(-1)强转成char型就是错误的,再转成int型是不对的,你可以试一下,把(-1)换成0--127之间的任何一值都是可以的。
作者: 梁小波    时间: 2012-6-3 14:48
-1是int类型的,先将他强转为char类型,在转回int类型,打印的结果应该还是-1,但是打印的结果却是65535
-1用二进制表示int
为11111111 11111111 11111111 11111111
转化为char就成了(java用的是Unicode集,Java字符16位无符号型数据)
11111111 11111111
当你再转为int的时候
为了补全;
00000000 00000000 11111111 11111111
而转换为十进制就是65535
作者: 胡团乐    时间: 2012-6-3 16:26
int类型用4个字节表示 char用2个字节表示 int转换为char出现精度流失
-1 的二进制表示11111111111111111111111111111111 32个1 可以用System.out.println(Integer.toBinaryString(-1));打印
由于char类型用2个字节表示出现精度流失变为(char)-1 就等于 1111111111111111 16个1
再转为int类型就是再次用4字节表示前面补0 (int)(char)-1 就等于00000000000000001111111111111111 十进制表示就是65535




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2