黑马程序员技术交流社区

标题: 一个 2+3 的问题。 [打印本页]

作者: 寐海流风    时间: 2014-6-11 22:54
标题: 一个 2+3 的问题。
本帖最后由 寐海流风 于 2014-6-14 10:32 编辑

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

虽然可以用 b += 2; 代替第2条语句;但是还是很想知道为什么第2条语句编译不能通过?期待大家解答。:)
作者: axuan    时间: 2014-6-11 23:22
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)
作者: 刘一阳    时间: 2014-6-11 23:33
2楼解释很细
b=(byte)(2+b) 完事
记住不同变量类型,不同字节。
作者: felixzr    时间: 2014-6-12 01:21
强转问题,二楼分析很详细
作者: 江祖贇    时间: 2014-6-12 08:01
学习学习
作者: kongyan4696    时间: 2014-6-12 08:21
2楼正解。  类型不匹配
作者: 师在飞    时间: 2014-6-12 08:28
顶顶顶。。。
作者: pk49800    时间: 2014-6-12 08:43
这样写右边的结果依然是int型,无法赋值给左边,需要将右边的整个运算结果强制转型b = (byte)(b+2)
作者: 姿_`态    时间: 2014-6-12 08:57
两个byte类型数据相加,系统会默认转化为int类型,因为怕byte装不下,所以会报错,可以看一下这个,也许会明白点,http://bbs.itheima.com/forum.php ... 1522&pid=771036

作者: Crystal静新    时间: 2014-6-12 09:51
嗯,猜测的可能:
编译器是先运算,自动向大范围转换,运算结束后再根据用户的要求,进行要求的换成。
个人认为这是编译器,它的执行顺序问题,它没有先执行 (byte)2再执行加法操作,所以类型不对,报错。
这告诉我们,有时候写程序或遇到问题,一定要注意程序的运行流程,电脑是台机器,JRE也是一个程序,它有它的规范和执行顺序。
作者: 黄宝宝    时间: 2014-6-12 09:54
楼上解释很清楚!
作者: 寐海流风    时间: 2014-6-12 10:43
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 10:45
姿_`态 发表于 2014-6-12 08:57
两个byte类型数据相加,系统会默认转化为int类型,因为怕byte装不下,所以会报错,可以看一下这个,也许会 ...

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

嗯,不用客气
作者: 姿_`态    时间: 2014-6-12 10:49
寐海流风 发表于 2014-6-12 10:45
谢谢,你提供的连接里讲的真详细。

不客气 ,共同学习




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2