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

新手问个关于强制转换的问题。
1  public static void main(String[] args) {
2 int m= 26; 
3 char c1=(char)m+1;
4 char c=(char)26+1;
       }

------解决方案--------------------
这个其实我也不大清楚,但是我试验了一下
int m = 1;
char a = m;
这个也是要报错的,错误原因也是损失精度
可能是整形变量在没有强制转换的情况下转换为字符型变量是要损失精度的
所以思考了一下你的代码 char c1=(char)m+1;
(char)m是一个字符变量变量
我又试验了一下一段代码:
int m= 26; 
System.out.println((char)m+1);
输出来的是27,说明(char)m+1是一个整形变量
那么整形变量在不经过强制转换就转换为字符型变量是要报错的
对了补充一下:如果(char)25+1是一个整数,得到的是26,整数传值给字符型的变量时是当做ASKII码来传值的,所以不会损失精度
------解决方案--------------------
char c = 27;表示的是ASCII码为27的一个字符。
char c1=(char)m+1;计算顺序:
先将m强制转换为char,不会报错;
char型与整数计算的时候,会向上转型为整型,此时就是类型不对的问题了。

而char c=(char)26+1;实际上是ASCII码的计算,不涉及类型的问题,就算没有(char)也不会报错的。
------解决方案--------------------
char c=26+1;编译运行通过,c为ASCII码为27的一个字符。
------解决方案--------------------
这用的着这么麻烦吗,,最后不要转来转去的,损失精度
------解决方案--------------------
实际上是ASCII码的计算,不涉及类型的问题  说得好

引用:
char c = 27;表示的是ASCII码为27的一个字符。
char c1=(char)m+1;计算顺序:
先将m强制转换为char,不会报错;
char型与整数计算的时候,会向上转型为整型,此时就是类型不对的问题了。

而char c=(char)26+1;实际上是ASCII码的计算,不涉及类型的问题,就算没有(char)也不会报错的。

------解决方案--------------------
三楼说得不错,如果 char c1=(char)((char)m+1);这样就可以正常通过编译,先将m转换成char,再与1相加类型自动提升,相加后为int型,最后将int结果强制转换成char型即可