黑马程序员技术交流社区

标题: +=的问题 [打印本页]

作者: 李伟    时间: 2012-6-13 12:51
标题: +=的问题
本帖最后由 李伟 于 2012-6-15 15:17 编辑

byte b=2;
b=b+3;//会出错可能损失精度
b+=3;//为什么用了+=就没有问题?
作者: 吴超    时间: 2012-6-13 12:54
本帖最后由 吴超 于 2012-6-13 13:12 编辑

byte b=2;
b=b+3;//会出错可能损失精度         (要强制把类型转换为byte   b=(byte)(b+3)    )
b+=3;//为什么用了+=就没有问题?

因为3默认是int类型的,b为byte类型,而b+3的结果会向上提升为int类型,b+3的int类型的结果赋给byte类型(相当于 500ml的可乐   倒进150ml可乐一样,会溢出很多)
b+=3      java编译器会对它进行特殊处理,因此可以正确编译
作者: 赵兵锋    时间: 2012-6-13 13:07
byte b=2;
b=b+3;//右边的表达式里是一个byte与一个int型作运算,byte会被转为int再参与运算,这样表达式结果是int型,但是等号左边是byte型,这是在把一个int型赋值给byte型,所以可能损失精度
b+=3;//这样我也不知道为什么可以,可能+=的实现里系统自动做了处理。
作者: 乐峰    时间: 2012-6-13 13:10
byte b=2;
b=b+3//出错是因为b是byte类型,而3是int类型,在赋值过程中,int类型转换到比它小的类型的过程中如果不进行强转会出现错误,所以要改成b=byte(b+3);
而b+=3;这种形式的赋值会被java虚拟机内部自动转换,不会报错。
作者: 余清兰    时间: 2012-6-13 13:21
本帖最后由 余清兰 于 2012-6-13 13:26 编辑

byte b=2; //因为你定义的b是byte型,
b=b+3;//3是int型,b+3的时候就把值提升为了int型,当赋给b这个byte型的时候,相当于是int型赋给byte型,超出了byte型的范围,就会出错可能损失精度
下面的b+=3,就是先加3然后,再赋值,就是先执行b+3的操作,这个时候,还没有赋值,但是这个时候已经把b变成了int类型(因为3是int型,相加后结果就会提升为int),然后再赋值,还是int类型的b=b+3
就相当于 int i = b + 3;  b = i;

作者: 王红霞    时间: 2012-6-13 13:47
因为+=是运算符  自带强制转换功能
作者: 吴琼    时间: 2012-6-13 13:55
byte b=2;
b=b+3;
b+=3;
呵呵这个题目老师讲过。是道面试题哦。首先你定义了一个byte类型的变量b。
然后你做了b=b+3.因为3默认类型为int。int类型占4个字节而b呢只占1个字节。
所有肯定从4个字节到1个字节肯定会损失精度。如果是b=b+3;的话必须把3强转为byte  改为b=b+(byte)3;就不会损失精度了
然而b+=3呢。+=是个运算符这里有个隐士的强转,所以就不会报损失精度的错误。


作者: 李伟    时间: 2012-6-13 15:43
刚试验了一下byte b=2;b+=3;之后b还是byte类型的,看来+=是把3强制转换成了byte
作者: 打工人    时间: 2012-6-13 17:45
b=b+3,3是int型的,在运算过程中等式的右边(b+3)会被提升成int型,而等式左边b依旧是byte类型的,所以会可能损失精度。
而+=是赋值运算符,只做赋值运算,内部会有自动转换。
作者: 申振华    时间: 2012-6-13 19:07
本帖最后由 申振华 于 2012-6-13 19:10 编辑

这里设计到自动提升类型问题。
byte b=3
b=b+3;// 右边的计算结果会自动提升为int类型       这样就变成了 short=int了 所以会出错
b+=3 ;//这里会存在隐式的自动提升类型     如果右边的计算结果没有超过左边的类型范围,这里的计算结果就是声明时的类型(byte)。如果右边到运算结果超过了左边的类型范围就会高位阶段,同样会有损精度

作者: yllw258    时间: 2012-6-14 13:14
b=b+3中3是int类型的,而b是byte型的,两者相加后的数据时int型的,而要将int型的数据赋给byte型的,肯定会损失精度。
但是,b+=3只做赋值运算,有自动转换动作。
作者: 位雪    时间: 2012-6-14 13:19
基础视频讲过:+=运算符自带强制转换功能
作者: 郑冬    时间: 2012-6-14 13:36
byte b=2;  b=b+3;//3为int型,b+3的时候就转化为了int型,当等于b这个byte类型的变量时,相当于把int类型赋值给了byte类型,从占用4个字节到占用1个字节,可能损失精度
呵呵,基础课程里详细讲了,+=运算符自身就有强制转换功能,建议认真看看视频
作者: 黄昆    时间: 2012-6-14 19:49
这里是类型自动提升
byte b=3//定义一个byte类型的变量
b=b+3;// 右边的计算:因为b是byte类型与3(int类型)运算时,b会进行类型自动提升,提升为int类型。结果将int类型的值赋值给byte类型就会出现精度损失。这里是两步运算,先自动提升与3运算再将值赋值给b
b+=3 ;//这里是一步运算,但是存在一个隐式的自动提升类型     如果右边的计算结果的值没有超过左边的类型取值范围,那么计算结果就是byte类型。如果右边到运算结果的值超过了左边的类型取值范围也同样会出现精度损失。




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