A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡宝林 中级黑马   /  2012-6-3 14:14  /  1867 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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

求高手解答!!!!

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

5 个回复

正序浏览
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
回复 使用道具 举报
-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
回复 使用道具 举报
在ASCII码里,是从0--127的,-1是没有对应的字符的,因而你将(-1)强转成char型就是错误的,再转成int型是不对的,你可以试一下,把(-1)换成0--127之间的任何一值都是可以的。
回复 使用道具 举报
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

基础的东西,好好看下视频吧,亲

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1 祝賀你,圓滿完成任務!

查看全部评分

回复 使用道具 举报
本帖最后由 黑马张扬 于 2012-6-3 14:35 编辑


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

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

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马