再次讨论int、byte编译问题

tyut8518 2008-09-09 07:21:04
1. byte b1=(int)1;
2. byte b2 =1;
3. byte b3 =b1+b2;
4. byte b4 =1+1;
第3行为什么编译不能通过?
...全文
145 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LoveJava520 2008-09-10
  • 打赏
  • 举报
回复
b1+b2,是整形,要转换为byte是错误的
axman 2008-09-10
  • 打赏
  • 举报
回复
换句话说,i=i++;可以,i=i+1;不行,那些牛人你来回答啊.
tyut8518 2008-09-09
  • 打赏
  • 举报
回复
呵呵 大家都比我牛 那你就告诉我吧 我没学过编译原理 有点不明白里边执行的原理与差别
axman 2008-09-09
  • 打赏
  • 举报
回复
你让上面的所谓的牛人答啊,不知道编译原理.想当然地瞎哄.

tyut8518 2008-09-09
  • 打赏
  • 举报
回复
1. byte b1=(int)1;
2. byte b2 =1;
3. byte b3 =b1+b2;
4. byte b4 =1+1;

在数值计算时,整数1也是默认为int类型的,在其他三行为什么就不需要强制类型转换呢???
no9988 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ZangXT 的回复:]
byte b3 =b1+b2;
b1+b2计算的时候把类型提升为int,所以结果是int类型的,你直接把int数赋给byte数所以报错.
直接看报什么错误就知道了.
[/Quote]

回答很对

因为 两个byte 相加的后的类型 会 转换成 int的
所以你 需要强制转换 回去`
`byte b3 =(byte)b1+b2;
这样写就应该对了
`
axman 2008-09-09
  • 打赏
  • 举报
回复
编译指令很简单,小于10的操作都有专门的指令,节省了操作数占用的空间.
i_load1;
就是byte操作直接用int指令操作. i_xxxx,没有b_xxx,s_xxx.c_xxx,所有byte,short,char,都是i_指令,最后itox转换回去
ZangXT 2008-09-09
  • 打赏
  • 举报
回复
byte b3 =b1+b2;
b1+b2计算的时候把类型提升为int,所以结果是int类型的,你直接把int数赋给byte数所以报错.
直接看报什么错误就知道了.
tyut8518 2008-09-09
  • 打赏
  • 举报
回复
不太了解状态机的工作原理,能否通俗一点 ,我只想了解JVM是怎么编译这些语句的
axman 2008-09-09
  • 打赏
  • 举报
回复
因为JVM为了做得小,减少了指令集.所有小于int的操作都以int指令操作然后itoX转换成原来的类型.

指令没有状态机,byte i = 0;i++操作从操作数知道i是byte,所以++后会自动itob.
但+操作和赋值操作之间没有状态.也就是根本不知道+后要赋给什么,有可能赋给long
所以不可能推算出itob.当然根据源码的下一行可以推算,但那不是指令做的事.

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧