黑马程序员技术交流社区

标题: short s1 = 1; s1 = s1 + 1; [打印本页]

作者: 成果    时间: 2012-2-9 18:36
标题: short s1 = 1; s1 = s1 + 1;
short s1 = 1; s1 = s1 + 1;这个为什么会出错咧?而这个short s1 = 1; s1 += 1是正确。

该贴已经同步到 寻找幸福的13狼的微博
作者: 任奇    时间: 2012-2-9 18:42
因为S1是short型的,占2个字节,而1是int型的,占4个字节。在两个类型的值相加的时候,会发生自动类型的提升。也就是说s1+1后,其结果是int型的,而不是short型的,所以可以想想看,把4个字节的东西放在两个字节的空间里,肯定编译不通过。   
     后面的那个不会发生类型的提升,JAVA规范上说    e1+=e2    实际上是    e1=(T1)(e1+e2),其中T1是e1的数据类型。   s1+=1等效于   s1=(short)(s1+1),所以是正确的。
作者: 许涛    时间: 2012-2-9 18:44

s1 = s1 + 1;是两次运算,先右边加法预算,再将结果赋给左边(先加法后赋值)
s1 + 1是int类型的值,再赋给short型的s1,容易损失精度


s1 += 1;是一次运算,把左右两边和赋给左边,s1 += 1只做赋值运算,数据会自动转换
类似于short s1 = 1;(数据右边只要在short范围内,就会自动转换)
作者: 成果    时间: 2012-2-9 18:44
{:soso_e142:}
作者: 戚雪晖    时间: 2012-2-9 19:33
s1=s1+1, ,1是int类型的,s1是short类型的,short+int ,可以想象运算结果是short型可以吗?假设结果是short类型,这时候如果结果范围超出了short类型的范围,那么计算结果会损失精度,导致计算结果不准确。因此java默认将结果进行自动类型提升,所以结果是int类型,而这时候内存中有一个short类型的空间,去存一个int类型的数据,显然是装不下去的。
s1+=1这句话就是算出两边结果直接赋值给左边,等价于s1=(short)(s1+1),可以简单理解为是这句话的简写模式。

作者: 李泽霖    时间: 2012-2-9 19:53
+=运算符应该会自己转换类型,但s1=s1+1;不会自动转型,short类型计算时自动转为int,所以要加个强制类型转化
作者: 戴振良    时间: 2012-2-10 00:38
在表达式中所有的byte型、short型和char的值将被提升到int型。
如果表达式中一个操作数是long型,计算结果就是long型;
如果表达式中一个操作数是float型,计算结果就是float型;
如果表达式中一个操作数是double型,计算结果就是double型。
关于s1 += 1不报错原因与沙发的答案一样。




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