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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈志伟 中级黑马   /  2012-4-14 18:17  /  2036 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代码:
  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的计算,却一定要转换?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

7 个回复

倒序浏览
因为c1 c2都为char类型,而c4也为char类型。
c1 +c2 的和可能会大出char类型的表示范围,这时候就会损失精度。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 刘士 于 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);
复制代码

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
必须要强转的。 额,比如说 你有一个馒头,我有两个馒头。
要想知道咱俩一共有几个馒头,你把咱俩加起来 那不是馒头 那是两个人。
你要先强转一下  char c4 =(char) (c1+c2);
就是得先把咱俩摁这儿  再把咱俩手里的馒头加一起
这个比喻可能不恰当  不过差不多就这么个意思

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
char 是 16位
int    是  32位
如果向上传,就是小的变大的没事(当然不是这个例子,是long或者short之类)
但是把32传给16位,一定会提醒精度损失
回复 使用道具 举报
因为c1和c2是变量,而变量的值是会变化的,所以就会默认使用int类型进行存储。
回复 使用道具 举报
char c4 = c1+c2 ;
char c1 = '1';
char c2 = '2';
运算后,会将结果自动提升为int型,   而 char 类型的取值范围小于 int 类型的取值范围,自然会提示可能损失精度。
char c3 = '1'+'2';运算后,没有自动类型提升,结果还是charl 类型,自然不会报错。

这里有个小知识,
自动类型提升:当byte short char  参与算数运算后,被被自动提升为int类型。
回复 使用道具 举报
自动类型提升:当byte short char  参与算数运算后,被被自动提升为int类型。因此、c1+c2运算后为int型数据,赋值给char时会损失精度。
作此char c4 =(char) (c1+c2);
将不会发生编译错误。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马