数据类型转换:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1=1,s2=1;short s3=s1+s2;


一个基础的数据类型转换问题,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 。第一眼看这个问题,能想到数据类型转换、 s1 = s1 + 1与复合赋值运算s1+=1问题的区别,深入可能是 += 的使用注意事项。这里由于思考了比较久,然后查阅了一些博客和官方文档关于 += 的赋值运算说明,这里做一下记录,巩固基础。


首先基本数据类型转换规则:高位转地位需要强制转换,地位转高位是自动转换,表达式两侧的转换规则是向左边的类型看齐。



short s1 = 1; s1 = s1 + 1;



s1=s1+1会存在数据类型转换问题. 1默认为int型,s1是short型进行运算时结果是int型(这里自动转换),等号右边结果是int型,相当于把int型赋值给short,那么就必须强制类型转换,否则就报错。正确的写法应该是s1=(short)(s1+1);


这个还挺好得出答案



short s1 = 1; s1 += 1;

这段代码经过我测试,编译运行没问题。

但是一开始我觉得这明明和第一个问题是一样的,不过转换思维,问的可能是+=的使用问题。参看以为前辈的博客是这样说的:

【java语言规范中关于复合赋值的解释是这样的:E1 op=E2等价于E1=(T)(E1 op E2),这里的T是E1的数据类型。】

原来这个复合赋值是自带了隐式的强制类型转换的。


所以说不会报错


short s1=1,s2=1;short s3=s1+s2;

这个思考就有点深入,一开始也是想不通,拿去eclipse中给出错误提示:

意思就是要s1+s2最后的值是int类型。


查阅资料,最后一位前辈的解释如下:

同类型的数据是不需要类型转换,那么这里为什么会有编译错误呢,报错的原因主要是从数据安全方面考虑的,s1+s2的默认类型是int,因为如果s1的值接近short类型取值范围的最大值,同时s2的值也接近short类型取值范围的最大值,那么s1+s2的肯定超出了short的取值范围,此时二者之和就是int型的数据,此时就需要强制把左边的int型数据转换为右边的short型。有些人又说了,我明明写的s1为1,s2也为1,那为什么还报错,因为此时还不知道s1和s2的值到底是多少。


【作者理解:应该说是根据jdk规范,编译器不会说检测到了两个short的值是1就不用转换为int,而是按照统一规范,不清楚short的赋值(不知道进行运算后值到底有多大),进行运算时为保证数据安全不丢失,直接转换成int】。所以这两句代码正确的写法应该是short s1=1,s2=1;short s3=(short)(s1+s2);






  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值