黑马程序员技术交流社区

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

作者: 程宏志    时间: 2012-10-31 21:47
标题: 数据类型的转换问题
class Demo
{
       public static void main(String []args)
      {
          short  a=3;
           a=a+2;
          System.out.println("a1="+a);
          a+=2;
         System.out.println("a2="+a);

             }
}
    上述程序中,为什么a=a+2这样的计算是缺少精度,不能运算呢,即使我强制性的转换写成a=a+(short)2,这样也不行呢?
    而下面a+=2的能运行能成功呢?请大侠帮我解释下:a=a+2与a+=2的区别?谢谢!
作者: 静等花开    时间: 2012-10-31 22:09
a比2占用字节少的时候,前者系统会自动进行类型转换,后者必须自己进行类型转换

short a = 3;
int b = 5;
a += b; //相当于 a = (short)(a+b);系统自动进行类型转换

a = a+b; //编译通不过,需要自己进行转换,即 a = (short)(a+b);
作者: 静等花开    时间: 2012-10-31 22:11
这个回答我觉很明了{:soso_e121:};希望对你有帮助
作者: 李连闯    时间: 2012-10-31 22:21
本帖最后由 李连闯 于 2012-10-31 22:43 编辑

Java语言的整数计算只有32位精度和64位精度两种,如果涉及long的计算会扩展到64位,
否则至少也用32位精度(这就是为什么a=a+(short)2这儿强转也不行的原因),
也就是说a = a+2;中右边的short型16位的a扩展到32位然后和int型32位的2相加,得到的是int型的数据,而等号左边的a是short型的所以这里会报错;
复合赋值运算符会自动地将运算结果转型为其左操作数的类型,所以 a+=2; 正确不报错;
作者: 林剑    时间: 2012-10-31 22:22
a=a+2缺少精度是因为你前面定义了a为short类型占2个字节,而2是int型占4个字节,a+2结束是整形复制给short型的a当然会损失精度。
a=a+(short)2当然不行,你直接强制将int型转换成short型少了2个字节,会损失精度
作者: 高志鹏    时间: 2012-10-31 22:30
a=a+2是运算后再赋值
a+=2是运算
区别就是一个赋值了,一个没有赋值动作。
作者: 张利    时间: 2012-10-31 22:44
a=a+2因为java中最小的运算空间为int,就算是两个byte型做运算,结果仍是int型;所以若想成功需要将最后的结果强转,及改成a=(short)(a+2)
  
a+=2 +=是运算符,java中会自动转换类型
作者: 打工人    时间: 2012-10-31 23:21
林剑 发表于 2012-10-31 22:22
a=a+2缺少精度是因为你前面定义了a为short类型占2个字节,而2是int型占4个字节,a+2结束是整形复制给short ...


“a=a+(short)2当然不行,你直接强制将int型转换成short型少了2个字节,会损失精度”
这里不对吧。。。。编译出错不是说(short)2出错。。。是说的整个加法,因为a和(short)2都是short,运算时自动提升成int,然后将这个int型的和复制给short型会损失精度。
若有语句执行a=(short)5555555;这样是不会报错的,输出结果会直接取5555555的二进制中低位开始的16位二进制,然后再以十进制输出。
作者: 邢晏玮    时间: 2012-11-1 02:08
a+=b是系统自动进行类型提升或者叫类型转换,而a=a+b是a+b的值赋给了a实际是进行了两步的运算,而a+=b是进行了一步的运算!
作者: 丁桂松    时间: 2012-11-1 07:21
本帖最后由 丁桂松 于 2012-11-1 07:22 编辑

记得一个规则。short byte char再参与运算时都会先将她们都转换成int再运算。a=a+2这样的计算结果是int 而你定义了变量a是short因此缺少精度,不能运算,
即使强制性的转换写成a=a+(short)2 也是两个short运算结果还是会转成int。你试下a = short(a+2)是不是不出错就可以验证我的说法。
另外除这3个类型的基本数据类型运算以外的,多元运算结果会取参与运算的最大范围数据类型的类型。

作者: 丁桂松    时间: 2012-11-1 07:23
还以个问题 += -= %= /= 各种等是系统做了自动类型提升的赋值运算符,当然是可以通过编译的。
作者: 林剑    时间: 2012-11-1 07:55
冯海霞 发表于 2012-10-31 23:21
“a=a+(short)2当然不行,你直接强制将int型转换成short型少了2个字节,会损失精度”
这里不对吧。。。。 ...

精度小于int的数值运算的时候都回被自动转换为int后进行计算。
原来是这样啊,thank you!
作者: 程宏志    时间: 2012-11-1 20:43
感觉大家说的很有道理,收益颇多,谢谢大家!
作者: 卜永富    时间: 2012-11-1 21:34
本帖最后由 卜永富 于 2012-11-1 21:38 编辑

short a = 3;
a = a + 2; // 报错,原因(a+2)算术表达式自动提升为int型,int型值不能赋给short型a
a += 2; // 通过,原因 a += 2,实际意义为将a的初始值找个临时地存储,然后定义short a = 2;最后将两个值相加,因为两个值都是short型。
两个运算的底层机制不一样。





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