1. byte b1=(int)1; 
2. byte b2 =1; 
3. byte b3 =b1+b2; 
4. byte b4 =1+1; 
第3行为什么编译不能通过?

解决方案 »

  1.   

    因为JVM为了做得小,减少了指令集.所有小于int的操作都以int指令操作然后itoX转换成原来的类型.指令没有状态机,byte i = 0;i++操作从操作数知道i是byte,所以++后会自动itob.
    但+操作和赋值操作之间没有状态.也就是根本不知道+后要赋给什么,有可能赋给long 
    所以不可能推算出itob.当然根据源码的下一行可以推算,但那不是指令做的事.
      

  2.   

    不太了解状态机的工作原理,能否通俗一点 ,我只想了解JVM是怎么编译这些语句的
      

  3.   

    byte b3 =b1+b2; 
    b1+b2计算的时候把类型提升为int,所以结果是int类型的,你直接把int数赋给byte数所以报错.
    直接看报什么错误就知道了.
      

  4.   

    编译指令很简单,小于10的操作都有专门的指令,节省了操作数占用的空间.
    i_load1;
    就是byte操作直接用int指令操作. i_xxxx,没有b_xxx,s_xxx.c_xxx,所有byte,short,char,都是i_指令,最后itox转换回去
      

  5.   


     回答很对 因为 两个byte 相加的后的类型 会 转换成 int的 
      所以你 需要强制转换 回去`
    `byte b3 =(byte)b1+b2;
    这样写就应该对了 

      

  6.   

    1. byte b1=(int)1; 
    2. byte b2 =1; 
    3. byte b3 =b1+b2; 
    4. byte b4 =1+1; 在数值计算时,整数1也是默认为int类型的,在其他三行为什么就不需要强制类型转换呢???
      

  7.   

    b1+b2,是整形,要转换为byte是错误的
      

  8.   

    换句话说,i=i++;可以,i=i+1;不行,那些牛人你来回答啊.