解决方案 »

  1.   

    "+"是逻辑运算符,在做byte之间做运算时,如 c = c+b,c+b的运算结果的数据类型会自动转换为了int类型
    想将int类型转换为byte类型,就会报错:只有 c = (byte)(c+b);就不会出错;
     c += b;这个运算的,数据类型是以 c的数据类型为标准的。所以不需要转换。
      

  2.   

    1、c = c + b ;是做了两个动作,先是加法运算,后是赋值运算。在进行加法运算的时候就已经确定了得到的结果是int类型的,所以不能再往c中存放,这样会报损失精度的错误。
    2、而 c+=b;它只做了一个赋值的过程,可以以byte类型来存放的情况下进行自动转换为byte。
      

  3.   

    +=有自动转换的功能  将 int 转换为byte
      

  4.   

    楼上正解,要先转换为int类型运算的,然后再强转
      

  5.   

    jvm里根本没有int以下的运算器,所有这些运算都是通过i2c、i2b转为int,计算完成后再c2i、b2i的转回来。
    也就是说你的等式等同于byte c = 2int + 3int;不做强转必然报错啊,你直接用int+int,然后又要求结果是个byte,jvm当然不认识了。
    +=在编译的时候自带类型转换,不需要再手工添加了。
      

  6.   

    c=a+b以及c+=b都是赋值表达式,其中c=a+b是简单赋值,c+=b是复合赋值,java语言规范中,复合赋值E1 op = E2等价于简单赋值E1 = (T)((E1)op(E2)),其中T是E1的数据类型,op为操作符
      

  7.   

    涨姿势了
    感觉前面几楼都是对的   自己还从来没有想过类似的问题
    才知道原来jvm中是没有int以下的运算器的    加法运算符运算过后已经自动转换成了int类型   
      

  8.   

    一般来说,a += b 的效率要比 a = a + b要高点。
      

  9.   

    好厉害。。
    byte 做运算,可能会产生超出该数据类型的数据。所以在内部加了强转吧。
    范围  byte [-128,127]
      

  10.   

    都一样啊,不都是inc或者add么
      

  11.   

    非常感谢各位的回答,
    总结一下:
    class  Demo1
    {
    public static void main(String[] args) 
    {
    byte b=1;
    /*
    b=b+1的运算过程为:b+1做加法运算,其中加法运算过程是以int类型为基础的,所以最后的结果就是int。
    所以在用=号赋值给b的时候,因为b为byte型,会报错,必须使用强制类型转换 b=(byte)(b+1)
    */
    b=b+1;

    }
    }
    class  Demo2
    {
    public static void main(String[] args) 
    {
    byte b=1;
    /*
    b+=1的运算过程为:
    1.运算b+1,当然,也是使用int基础运算的,结果也是int
    2.运算求和之后,使用强制类型转换,转换的类型就是b的类型,即byte
    3.将byte类型的结果赋值给b
    */
    b+=1;
    }
    }
    另外    long tmp=365 * 24 * 60 * 60 * 1000;是错误的,因为会结果溢出的。原因就是加法运算的过程。
    这样就对了 long tmp=365 * 24 * 60 * 60 * 1000l,就是参加运算的随便一个数为long型
      

  12.   

    都一样啊,不都是inc或者add么在汇编中,inc要比add效率高丫!