黑马程序员技术交流社区
标题:
问个类型转换的问题
[打印本页]
作者:
陈志伟
时间:
2012-4-14 18:17
标题:
问个类型转换的问题
代码:
class conver
{
public static void main(String[] args)
{
char c1 = '1';
char c2 = '2';
char c3 = '1'+'2';
char c4 = c1+c2;
}
}
复制代码
编译不过去,如图:
1.jpg
(9.8 KB, 下载次数: 31)
下载附件
2012-4-14 18:15 上传
请问,为何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的时候就会产生这个错误。
可以这么写
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