short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
先说一下Java的基本数据类型转换规则,大的数据类型转换为小的数据类型需要强制转换,反之可以自动转换。
赋值表达式等号两侧的转换的规则是右侧的向左侧的看齐,即右侧表达式要转换到和左边的类型一样。
那么short s1 = 1; s1 = s1 + 1;的运行就是错的。因为s1 + 1中,s1是short类型,1是int型,s1会自动转换为int型的1,与1相加后,得到int型的2,然后要向左侧的short类型的s1看齐,即需要通过强制类型转换将int型的结果转换成short型才赋值给s1。正确写法是:s1 = (short) (s1 + 1);。
接着short s1 = 1; s1 += 1;的运行是正确的。因为执行s1+=1时,其实执行的是s1 = (short) (s1 + 1); 其中会有一个隐藏起来的强制转换的过程,所以是运行正确的。
最后short s1=1,s2=1;short s3=s1+s2;的运行就是错的。这里是编译器从数据安全方面考虑,如果s1和s2都是较大的short类型数据值,那么它们加起来就会超出short型的取值范围,可能会导致溢出,所以会要求将short型强制转换到int型。正确写法是:short s3 = (int)s1 + s2;。