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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝少普 中级黑马   /  2012-11-19 00:00  /  1646 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sp000 于 2012-11-19 22:34 编辑

short s1 = 1; s1 = s1 + 1;有什么错?
short s1 = 1; s1 += 1;有什么错

点评

上面是强转丢失精度,编译错误; 下面是直接赋值,可以通过 。  发表于 2012-11-19 03:13

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
short s1 = 1; s1 = s1 + 1;有什么错?
这句话的错误在于
1.默认情况下整数的类型为int型
2.也就是说在做s1+1的运算时,s1被自动提升为了int型。
3他们的运算结果是占四个字节的int型,但却要赋值给占两个字节的short型变量,所以才会出错
short s1 = 1; s1 += 1;
这句话是没有错误的,原因在于
1.这句话s1+=1;其实只进行了一次赋值运算,内部自动进行了类型转换
以上只是我的个人理解,希望能够帮到你

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
(1)short s1 = 1; s1 = s1 + 1是编译不过去的,因为s1+1:short型的数与整数1相加后,会自动提升类型,结果为整型,把整型赋给short,会损失精度,会出现错误的
(2)short s1 = 1; s1 += 1;(可以正确编译)由于+=运算符有自加功能,定义short s1 = 1;时,开辟了一个空间,当通过+=运算符运算时,只是在原来的栈中进行运算;不需强行转化

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
short s1 = 1; s1 = s1 + 1;    这句中1是int型,在做加运算时会做自动类型提升,加完后是int型,int型赋值给short型,会有损精度;
short s1 = 1; s1 += 1;该句在运行时不会做类型提升,内部类型转换,不用强转,可编译通过!

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
short s1 = 1; s1 = s1 + 1;有什么错?
在这里s1=1是short型,而s1=s1+1,这里的运算法则是short型+1(整型),这样的就看出来不一样的数据类型是不能一起做运算的,这里也涉及到一个问题,希望楼主记住,在java中基本的数据类型在运算中像自然数的在没有明确数据类型的情况下,默认的是整行(int),而带小数的默认的是double型的

short s1 = 1; s1 += 1;有什么错
在这句话中,s1+=1中和上面的问题和上面的是不一样的,在这里你应该明白一点,s1=1是对的不?显然这是对的,在这里,=这是赋值的符号,其实+=这也是赋值号,s1=1.这句话是对的,同样的赋值好+=中,s1+=1,那也是对的!希望对你有用
   

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Java中涉及byte、short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果。因此,如果把两个short类型值相加,最后会得到一个int类型的结果。如果需要得到short类型结果,必须将这个int类型的结果显式转换为short类型。
short占2个字节,int占4个字节,short型变量+上int型值计算结果是int型,占4个字节,然后付给一个short型变量s1,就要丢失2个字节的精度,这是不容许的。
s1=s1+1;改成s1+=1;虽然是一个意思,但是在jvm里面是不同的方法做的,是运算符重载,所以是不一样的。
short s1 = 1; s1 += 1;是正确的。因为这是一个一个复合赋值表达式自动地将它们所执行的计算的结果转型为其左侧变量的类型。这里面有个隐藏的数据转型。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
short占2个字节,int占4个字节,short型变量+上int型值计算结果是int型,占4个字节,然后付给一个short型变量s1,就要丢失2个字节的精度,这是不容许的。你非要这么做的话,我给你提供一个办法:
   s1=s1+1;改成s1+=1;虽然是一个意思,但是在jvm里面是不同的方法做的,是运算符重载,所以是不一样的。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
陈军 中级黑马 2012-11-19 11:20:39
8#
第一句:s1 = s1 + 1;
    这句没有自动类型转换成short。=号右边s1会有个自动类型提升。
再和int值1做运算,结果为int型,再赋值给short型变量。这是不允许的。编译就错。

第2句s1+=1 ;  这句因为有自动类型转换。

虚拟机会把运算结果的int型值,直接转换成short型值赋值给s1(即使会损失精度)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马