关于类型转换与运算问题
目录
一个经典的类型转换问题
高位转低位需要强制转换,低位转高位是自动转换,表达式两侧的转换规则是向左边的类型看齐
- short s1=1;s1=s1+1;
s1+1值是自动转换int类型,而是s1是short类型 所以会提示你转为short类型,s1= (short) (s1+1)就正确了。
- short s1=1;s1=+=1; 这个为什么不报错
因为java语言规范中关于复合赋值的解释是这样的:e1+=e2实际上是e1=(T1)(e1+e2),这里的T1的数据类型。所以不会报错。
- short s1=1,s2=1;short s3=s1+s2 这个为什么会报错
首先java编译时会出于安全考虑:因为如果s1的值接近short类型取值范围的最大值,同时s2的值也接近short类型取值范围的最大值,那么s1+s2的肯定超出了short的取值范围,此时二者之和就是int型的数据,此时就需要强制把左边的int型数据转换为右边的short型。那么这里明明声明了short类型为什么还会错,因为此时还不知道s1和s2的值到底是多少,处于安全考虑会让强转高位转低位 short s3=(short)(s1+s2)
- short s1+=1
java没有这种写法 在声明变量时运算
以上的分析都对byte、short或char类型有效;因为这些类型在运算时都会自动扩展,因为在栈中不会存在这些类型的数据都会被转换为int类型。