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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 成果 黑马帝   /  2012-2-9 18:36  /  2600 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

short s1 = 1; s1 = s1 + 1;这个为什么会出错咧?而这个short s1 = 1; s1 += 1是正确。

该贴已经同步到 寻找幸福的13狼的微博

点评

建议发帖前请搜下帖这个问题出现很多遍了。 谢谢。。。  发表于 2012-2-9 19:52

6 个回复

倒序浏览
因为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),所以是正确的。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报

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


s1 += 1;是一次运算,把左右两边和赋给左边,s1 += 1只做赋值运算,数据会自动转换
类似于short s1 = 1;(数据右边只要在short范围内,就会自动转换)
回复 使用道具 举报
{:soso_e142:}
回复 使用道具 举报
s1=s1+1, ,1是int类型的,s1是short类型的,short+int ,可以想象运算结果是short型可以吗?假设结果是short类型,这时候如果结果范围超出了short类型的范围,那么计算结果会损失精度,导致计算结果不准确。因此java默认将结果进行自动类型提升,所以结果是int类型,而这时候内存中有一个short类型的空间,去存一个int类型的数据,显然是装不下去的。
s1+=1这句话就是算出两边结果直接赋值给左边,等价于s1=(short)(s1+1),可以简单理解为是这句话的简写模式。
回复 使用道具 举报
+=运算符应该会自己转换类型,但s1=s1+1;不会自动转型,short类型计算时自动转为int,所以要加个强制类型转化
回复 使用道具 举报
戴振良 黑马帝 2012-2-10 00:38:52
7#
在表达式中所有的byte型、short型和char的值将被提升到int型。
如果表达式中一个操作数是long型,计算结果就是long型;
如果表达式中一个操作数是float型,计算结果就是float型;
如果表达式中一个操作数是double型,计算结果就是double型。
关于s1 += 1不报错原因与沙发的答案一样。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马