byte i=1;
     i+=1234;
     System.out.println(i);
打印出来是-45,为什么是这样啊?
默认应该把1234转化成int,这样会编译不通过,那为什么不报错呢

解决方案 »

  1.   

    你把你这句代码:i+=1234; 改为:i = i + 1234; 这样就会报错了! 
      

  2.   

    楼上讲了为什么不报错如果你还想知道为什么是-45 ,
    就理解下补码与反码(btye)1234 = -46;
      

  3.   

    你知道(btye)1234 为什么是-46 吗你可以把1234 转换成二进制
    100 1101 0010
    byte 只有八位,长的转换成短的会丢失精度,
    即得到1101 0010
    高位为符号位,1  表示负 0 表示正,负转换要取反码+1
    反码:00101101 
    +1  :00101110
    00101110 = 46因为高位是负所以得出 结果 1234 为-46
      

  4.   

    娃,有意思。
    其实怎么理解都行。
    1,1234为int,先把i转int,再把结果专为byte,也就是取了结果那个int数(1235)的低八位,当补码解析,就是-45(11010011);
    2,这个运算符直接将后面的int数转为了byte,也就是取了1234的低八位(11010010),再加一,结果做补码解析,仍然-45;
    至于jvm到底是那种工作机制就不知道了哦,反正向下转型就会造成数据丢失,甚至出错。