黑马程序员技术交流社区

标题: 小弟有一个小小的问题 [打印本页]

作者: 花开~的季节    时间: 2012-2-20 17:52
标题: 小弟有一个小小的问题
byte b=3;
b=3+4;
java 中计算默认的int 3+4=7为int类型,它赋值给byte不损失精度么,从int到byte强行转换应该加byte,而这个没加怎样它自动转成了byte
求帮助呀!!!!
作者: 许涛    时间: 2012-2-20 18:27
本帖最后由 许涛 于 2012-2-20 20:09 编辑

先前会错题意了


b=3+4 ;应该是类似于 byte b=3;         它是一个自动转换过程,只要等号右边的数据在byte范围内(-128~127),就会自动转换
作者: 最初的理想    时间: 2012-2-20 19:19
b=3+4; 没有强制类型转化却没有报错,是不是右边的计算结果可以容纳在byte中不会出现位丢失的情况呢,所以不用类型转换呢?如果右边的值在-128---127之外就会出现强制类型转换,出现位丢失。本菜这么看的,当然为了更好理解,b=(byte)3+4;也可以啊。
作者: 温昌寿    时间: 2012-2-20 21:55
这个是由JVM决定的吧,会自动转换然后超过会丢位
作者: 花开~的季节    时间: 2012-2-20 22:04
最初的理想 发表于 2012-2-20 19:19
b=3+4; 没有强制类型转化却没有报错,是不是右边的计算结果可以容纳在byte中不会出现位丢失的情况呢,所以 ...

3+4=7byte在-128--127内可以容纳,那么byte b=3; b=b+3;
b+3算 出来的结果也为int呀,但没有强制性转换也是错的呀却是错误的。
作者: 花开~的季节    时间: 2012-2-20 22:08
许涛 发表于 2012-2-20 18:27
先前会错题意了

那为何,byte b=3;
b=b+4;右边算出来也是7为int类型呀!它却不自动转换呢!要加个byte强行转换。。。
作者: 李晓俊老师    时间: 2012-2-20 22:46
楼主,虽然你定义了byte b = 3;
但是在b = 3+4;这里的3不是你定义的b,它就是一个数字3,,这个语句就是把3+4的值赋给了b,,,,
整个过程中,b并没有参与运算,所以不存在类型提提升
如果是b = b+4,就是将b+4的值重新赋给了b,,这里b参与了运算,4是int型的,所以b被提升了,
在将b+4赋给b的时候必须强制转换一下......
作者: 许涛    时间: 2012-2-20 23:00
花开~的季节 发表于 2012-2-20 22:08
那为何,byte b=3;
b=b+4;右边算出来也是7为int类型呀!它却不自动转换呢!要加个byte强行转换。。。 ...

因为b=b+4;是两次运算,是先右边加法预算,再将结果赋给左边(先加法后赋值),b+4是int型的值,再赋给byte型的b,容易损失精度
有别于b=3;因为它是一次运算,只要数据在byte范围内,将自动转换
作者: 房宝彬    时间: 2012-2-21 00:01
看来这题我也能拿分,以上都没说出关键

byte = 3+7  与  int a=3; int b=7;  byte=a+b;
前者可以编译通过是因为右边的是常量,不是变量,所以在编译时,常量的和没有超过byte的范围,所以能通过.
后者是因为右边的是变量,变量的值不确定,所以在编译时虚拟机会考虑这个变量有可能超过byte的范围,所以编译失败.
-------------------------------------------------------------------------------------------------------------------------------------------------
了解变量与常量的关系就OK了,这是笔试题中的一道.希望能帮助到你/
作者: 最初的理想    时间: 2012-2-21 21:14
学习了,好问题




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