黑马程序员技术交流社区

标题: 问个类型转换的问题 [打印本页]

作者: 陈志伟    时间: 2012-4-14 18:17
标题: 问个类型转换的问题
代码:
  1. class  conver
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 char c1 = '1';
  6.                 char c2 = '2';
  7.                 char c3 = '1'+'2';
  8.                 char c4 = c1+c2;
  9.         }
  10. }
复制代码
编译不过去,如图:

请问,为何c3的计算,不用强制转换。但c4的计算,却一定要转换?
作者: 王永旺    时间: 2012-4-14 18:35
因为c1 c2都为char类型,而c4也为char类型。
c1 +c2 的和可能会大出char类型的表示范围,这时候就会损失精度。
作者: 刘士    时间: 2012-4-14 18:37
本帖最后由 刘士 于 2012-4-14 18:39 编辑

char 是一个 unsigned 整数,表示一个字符的 UTF-16 编码(可能是2或4字节)的一个16位代码单元。
运算时,char 是一个小于 int 的整数类型,根据 Java 的二元操作类型转换规则, char + char 被转换成 int + int,结果是 int。
所以当你要赋给char的时候就会产生这个错误。

可以这么写
  1. char c4 = (char) (c1+c2);
复制代码

作者: 刘占月    时间: 2012-4-14 18:38
必须要强转的。 额,比如说 你有一个馒头,我有两个馒头。
要想知道咱俩一共有几个馒头,你把咱俩加起来 那不是馒头 那是两个人。
你要先强转一下  char c4 =(char) (c1+c2);
就是得先把咱俩摁这儿  再把咱俩手里的馒头加一起
这个比喻可能不恰当  不过差不多就这么个意思
作者: 马强    时间: 2012-4-14 18:42
char 是 16位
int    是  32位
如果向上传,就是小的变大的没事(当然不是这个例子,是long或者short之类)
但是把32传给16位,一定会提醒精度损失
作者: 张一凡    时间: 2012-4-14 18:59
因为c1和c2是变量,而变量的值是会变化的,所以就会默认使用int类型进行存储。
作者: 吴高其    时间: 2012-4-14 20:48
char c4 = c1+c2 ;
char c1 = '1';
char c2 = '2';
运算后,会将结果自动提升为int型,   而 char 类型的取值范围小于 int 类型的取值范围,自然会提示可能损失精度。
char c3 = '1'+'2';运算后,没有自动类型提升,结果还是charl 类型,自然不会报错。

这里有个小知识,
自动类型提升:当byte short char  参与算数运算后,被被自动提升为int类型。
作者: 黑马-王建雨    时间: 2012-4-14 22:36
自动类型提升:当byte short char  参与算数运算后,被被自动提升为int类型。因此、c1+c2运算后为int型数据,赋值给char时会损失精度。
作此char c4 =(char) (c1+c2);
将不会发生编译错误。




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