short a=1;
         a=a+1;
时会出现损失精度的错误,但a+=1就不会,哪位给俺解释一下他们的区别呗,同学给我说的是地址引用的原因但 我还是不太明白,请详细的说一下呗

解决方案 »

  1.   

    short 会损失啥精度,说清楚点
      

  2.   

    a=a+1; 1为int,a+1也为int,把int赋值给short的a,当然是错误的,损失精度的
      

  3.   

    a+=1
    要了解jvm内部处理机制,等高手解答
      

  4.   

    short a=1; 
            a=a+1; 还是内存分析:
    short a=1;
    a=a+1;
    //内存里有一个a,在运算的时候,又创建了一个临时变量,其值为short型的1;
    //也就是说这个运算实际上是在做 a /*int*/ = a /*short*/ + 1 /*int*/  1是int型这个是因为对整数类型都默认为int型.
    //这样我们就很容易看出来产生了类型不符的错误.short a=1;
    a+=1;//这里则直接把a的值增加1.//注:类型不匹配的问题.-128  到  127之间的整数在short和int之间的转换之中应该是没有精度丢失问题的.
      

  5.   

    a=a+1;
    不是损失精度,是编译错误
    原因如2楼所说
    至于a+=1;也不是很清楚内部如何运作
      

  6.   


    这不就是精度损失嘛,还有,short占2个字节,范围是-2^16 ---- 2^16-1
    假设加的不是1,是b,你能保证能在这个范围内吗?即使是1,要是a为2^16-1,那也会溢出。
      

  7.   

    假如表达式是 E1 op= E2 这种样子的(op是运算符,E1、E2是操作数),
    实际上内部是这样做的 E1 = (T)((E1) op (E2)),其中 T 表示 E1 的类型。比如:
    short x = 3;
    x += 4.6;内部是这样工作的:
    short x = 3;
    x = (short)(x + 4.6);这里面还有很多细节问题,具体详见 Java Language Specification §15.26.2
    http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.26.2
      

  8.   

    好像以前出现过此问题的哈
    在JVM内部 处理如下:
    E1 op= E2 => E1 = (T)((E1) op (E2))所以 short xx = 1;
    xx += 1; <==> xx = (short)(xx + 1); 所以不会有错误哈 隐式转换了哈
      

  9.   

    太感谢了,初步明白了,特别是lgg201太感谢大家了,还有那个提供链接的朋友,你的链接全是英文,俺不行
    啊,呵,有待修练,谢谢!~~~
      

  10.   

    http://topic.csdn.net/u/20090221/21/52ecaf68-df22-411c-b0c1-176aa110427d.html?seed=17345125246楼牛人给了答案