黑马程序员技术交流社区

标题: 关于赋值符+= 与损失精度的问题 [打印本页]

作者: kevinmesss.tz    时间: 2014-2-4 08:37
标题: 关于赋值符+= 与损失精度的问题
short s = 5 ;
s = s + 5 ;(5是int类型 等式右边自动提升为int 在将int赋值给short会损失精度 编译报错)
s += 5 ;毕老师说+=是将两边的和赋予左边
那么s是short类型 5是int 左右两边的和是int类型 而s是short类型,
为什么这里不会出现损失精度的问题?
新人第一次发帖 请大家多多关照!{:soso_e100:}
作者: 刘文涛    时间: 2014-2-4 14:04
短整数型,  s=s+65535   你试试!
作者: yekong262    时间: 2014-2-4 20:19
s=s+5  这个是有两个运算,一个加法运算,一个赋值运算。
而 s+=5 这个只有一个运算 把 s+5的和赋值给s 只有一个赋值运算。。 希望说的能对你有帮助。
作者: kevinmesss.tz    时间: 2014-2-5 03:17
yekong262 发表于 2014-2-4 20:19
s=s+5  这个是有两个运算,一个加法运算,一个赋值运算。
而 s+=5 这个只有一个运算 把 s+5的和赋值给s 只 ...

s+5的和难道不是int类型的吗 在把int赋值给short不会损失精度?
作者: kevinmesss.tz    时间: 2014-2-5 03:20
还有。。怎么样才有技术分!
作者: 张洪慊    时间: 2014-2-5 12:39
本帖最后由 张洪慊 于 2014-2-5 14:27 编辑

又看见这个问题,我心血来潮,
short s=5;
s+=5;//在学到这时,毕老师说左右两边的值相加赋值给左边,并且会自动强转(int->short)
那么真的是这样吗?我们通过javap.exe这个命令来看看编译器对其编译后,交给JVM执行的指令是怎样的.
示例代码:
  1. class Test{
  2.         public static void main(String[] args){
  3.                 short s=5;
  4.                 s+=5;
  5.         }
  6. }
复制代码
编译后生成的Test.class ,我们javap -c -p Test.class:

的确有一个强转指令i2s(int to short)
作者: HelloSummer    时间: 2014-2-5 21:21
这个问题前阵子刚好遇到也相当困惑。后来问了一个学长,下面是他给我的这个公式。你看下应该后悔明白了:
  1. E1 op= E2 带运算的赋值运算符,运算公式: E1 op= E2 相当于 E1 = (T)((E1) op (E2)),T是E1类型

  2. 例:byte b = 1;b += 1; 等价于  byte b = 1;b =(byte)(b + 1);
复制代码

所以这里是有隐含了一个强制类型转换的。这样就容易理解了吧。
(PS:努力学习中,求入学~求技术分~)

作者: kevinmesss.tz    时间: 2014-2-6 12:10
HelloSummer 发表于 2014-2-5 21:21
这个问题前阵子刚好遇到也相当困惑。后来问了一个学长,下面是他给我的这个公式。你看下应该后悔明白了:

...

这个我看懂了 谢谢




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