隐含强制类型转换:顾名思义,看不见的强制类型转换,关于这个问题,我们先来读懂一句话:
byte b =3;
我们知道一个整数的默认类型int类型,没错3是int类型,当把3赋值给b的时候,其实默认有一个强制类型转换,编译器判断3在byte类型的范围之内,强制把3转换成了byte类型,然后赋值给了b。所以这就被称作隐含强制类型转换,下面我们来看一个简单的问题:
如图:上面两段代码的目的是一样的,要把10赋值给byte类型的b,但是结果是图一正确运行,图二报错。为什么呢?
图一:b=3+7;等号右边的是常量,编译器先计算表达式的结果为10,判断10在byte类型的范围之内,于是就把int类型的值强制转换成byte类型赋给b;
图二:b=b1+b2; 等号右边是两个变量,但是变量的值是不确定的。编译器无法判断是否超出了byte类型的取值范围,没办法进行强制类型转换,所以出现如图所示的提示:从int转换到byte可能会有损失(如果超出范围,会丢失高位)。
知道原因之后,我们尝试把byte改成short类型结果也是一样的:
但是我们改成int类型;
输出结果10,是能够运行的,因为int是默认类型,所以不存在隐含强制类型转换的问题,所以编译当然不会报错。
那么问题又来了:
short b=3; 与 short b=3;
b+=2; b=b+2;
的区别:
b+=2是可以编译成功的。+=也是一个赋值运算符,在底层是一个动作并且有一个强制转换的一个过程(不用我们自己强转);
但是b=b+2;不能编译成功,这是两个动作,先求和再赋值,求和时b自动类型提升,求和结果是int类型,但是因为编译器无法判断数值大小,所以无法为我们强制转换类型,所以编译报错:
虽然我们可以自己写强制转换,但是可能的结果编译器已经告知,可能会丢失精度。
即 b=(short)(b+2); 总结,如果等号左右两边的类型不匹配:
(1)如果右边是常量,编译器会判断数值大小是否在范围内,如果在就做强制类型转换,不在就报错;
(2)如果右边是变量,编译器无法判断数值大小,不会做强制类型转换,会报错(可以自己强制转换);
(3)+=,-=,*=,/=,%=赋值运算符不管是否在范围内都会做强制类型转换。
(*^__^*) ——END
隐含强制类型转换:顾名思义,看不见的强制类型转换,关于这个问题,我们先来读懂一句话:
byte b =3;
我们知道一个整数的默认类型int类型,没错3是int类型,当把3赋值给b的时候,其实默认有一个强制类型转换,编译器判断3在byte类型的范围之内,强制把3转换成了byte类型,然后赋值给了b。所以这就被称作隐含强制类型转换,下面我们来看一个简单的问题:
如图:上面两段代码的目的是一样的,要把10赋值给byte类型的b,但是结果是图一正确运行,图二报错。为什么呢?
图一:b=3+7;等号右边的是常量,编译器先计算表达式的结果为10,判断10在byte类型的范围之内,于是就把int类型的值强制转换成byte类型赋给b;
图二:b=b1+b2; 等号右边是两个变量,但是变量的值是不确定的。编译器无法判断是否超出了byte类型的取值范围,没办法进行强制类型转换,所以出现如图所示的提示:从int转换到byte可能会有损失(如果超出范围,会丢失高位)。
知道原因之后,我们尝试把byte改成short类型结果也是一样的:
但是我们改成int类型;
输出结果10,是能够运行的,因为int是默认类型,所以不存在隐含强制类型转换的问题,所以编译当然不会报错。
那么问题又来了:
short b=3; 与 short b=3;
b+=2; b=b+2;
的区别:
b+=2是可以编译成功的。+=也是一个赋值运算符,在底层是一个动作并且有一个强制转换的一个过程(不用我们自己强转);
但是b=b+2;不能编译成功,这是两个动作,先求和再赋值,求和时b自动类型提升,求和结果是int类型,但是因为编译器无法判断数值大小,所以无法为我们强制转换类型,所以编译报错:
虽然我们可以自己写强制转换,但是可能的结果编译器已经告知,可能会丢失精度。
即 b=(short)(b+2); 总结,如果等号左右两边的类型不匹配:
(1)如果右边是常量,编译器会判断数值大小是否在范围内,如果在就做强制类型转换,不在就报错;
(2)如果右边是变量,编译器无法判断数值大小,不会做强制类型转换,会报错(可以自己强制转换);
(3)+=,-=,*=,/=,%=赋值运算符不管是否在范围内都会做强制类型转换。
(*^__^*) ——END