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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 弘一 中级黑马   /  2013-12-8 16:55  /  1026 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Test
{
        public static void main(String[] args)
       {
             short a = 3;
             short b = 4;
             short c = a + b;
             System.out.println(c);
      }
}

short c = a + b;为何相同的数据类型错精度损失

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

8 个回复

倒序浏览
因为这个时候a+b 编译器认为是int类型的  (short)(a+b)就可以解决了
回复 使用道具 举报
short a 和 short b 在参与运算时会自动提升为int类型,所以将int类型赋值给short类型会报错。
回复 使用道具 举报
这。。。。如果你想保留精度就必须定义short类型  格式就是:short a = 0.0f; 你定义的a和b编译器会认为是Int类型,你把俩加起来也是Integer类型,所以相加就没有精度
回复 使用道具 举报
因为short c = a+b;默认是int型相加,所以加了以后结果是int,,int到short自然会精度损失。
回复 使用道具 举报
short在内存中占2个字节,以十六个二进制位表示,范围负的2的15次方到正的2的15次方-1;-32768~32767
内存很小,为避免内存溢出,需要强制转换。
回复 使用道具 举报
Cola 中级黑马 2013-12-8 21:12:38
7#
我觉得是,前边3,4虽然是int,但是是在short范围内的,可以转为short。但是a+b中a和b是变量,虚拟机不能判断a+b的值是否在short范围内,所以报错。
回复 使用道具 举报
short,byte,char在进行相加减时,会自动将其类型提升为int型,
也就是说运算结果是int型,这时候你将一个int型赋给short,byte,char
会提示可能损失精度。
回复 使用道具 举报
short c = a + b;
       a+ b在参与运算的时候,首先会自动转换成int类型。
       在这个时候,a和b其实都被提升了类型。
       所以,他们的计算结果也应该是int类型。
        最终,就相当于直接把int类型赋值给byte类型,所以,会有精度的损失。
如果short c = 3 + 4;
      编译则通过。
        因为参与运算的是常量,编译器会先计算值,在看该值是否是左边能够表示的范围。
        如果是,就不报错。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

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