一个基础的数据类型转换问题,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);