A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 寐海流风 中级黑马   /  2014-6-11 22:54  /  1804 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 寐海流风 于 2014-6-14 10:32 编辑

以前自学遇到的一个问题。下面代码为什么编译不能通过呢?
byte b = 2;
b = b + (byte)2;

虽然可以用 b += 2; 代替第2条语句;但是还是很想知道为什么第2条语句编译不能通过?期待大家解答。:)

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

14 个回复

倒序浏览
1. 在Java中,byte类型数据在运算之前要转换成int类型数据。
2  b = b + (byte)2; 此时做加法,会转换成int型,所以 b + (byte)2结果为int,而b为byte所以通过,
3  高级别数据不会隐式转换成低级别数据,所以要在b + (byte)2前面加上byte,强转
   即  (byte) (b + (byte)2)

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报 1 0
2楼解释很细
b=(byte)(2+b) 完事
记住不同变量类型,不同字节。
回复 使用道具 举报
强转问题,二楼分析很详细
回复 使用道具 举报
学习学习
回复 使用道具 举报
2楼正解。  类型不匹配
回复 使用道具 举报
顶顶顶。。。
回复 使用道具 举报
这样写右边的结果依然是int型,无法赋值给左边,需要将右边的整个运算结果强制转型b = (byte)(b+2)
回复 使用道具 举报
两个byte类型数据相加,系统会默认转化为int类型,因为怕byte装不下,所以会报错,可以看一下这个,也许会明白点,http://bbs.itheima.com/forum.php ... 1522&pid=771036
回复 使用道具 举报
嗯,猜测的可能:
编译器是先运算,自动向大范围转换,运算结束后再根据用户的要求,进行要求的换成。
个人认为这是编译器,它的执行顺序问题,它没有先执行 (byte)2再执行加法操作,所以类型不对,报错。
这告诉我们,有时候写程序或遇到问题,一定要注意程序的运行流程,电脑是台机器,JRE也是一个程序,它有它的规范和执行顺序。
回复 使用道具 举报
楼上解释很清楚!
回复 使用道具 举报
axuan 发表于 2014-6-11 23:22
1. 在Java中,byte类型数据在运算之前要转换成int类型数据。
2  b = b + (byte)2; 此时做加法,会转换成int ...

:D
原来如此,也就是虽然b+(byte)2 两个都是byte,但是计算结果被隐式提升为了int型,所以不能用byte型来接受,是吧。
多谢!
回复 使用道具 举报
姿_`态 发表于 2014-6-12 08:57
两个byte类型数据相加,系统会默认转化为int类型,因为怕byte装不下,所以会报错,可以看一下这个,也许会 ...

谢谢,你提供的连接里讲的真详细。:)
回复 使用道具 举报
寐海流风 发表于 2014-6-12 10:43
原来如此,也就是虽然b+(byte)2 两个都是byte,但是计算结果被隐式提升为了int型,所以不能用byte型 ...

嗯,不用客气
回复 使用道具 举报
寐海流风 发表于 2014-6-12 10:45
谢谢,你提供的连接里讲的真详细。

不客气 ,共同学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马