隐含强制类型转换——从变量说起

时间:2024-04-08 12:16:43

         隐含强制类型转换:顾名思义,看不见的强制类型转换,关于这个问题,我们先来读懂一句话:

         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

转载自: https://blog.csdn.net/pt666/article/details/70471003

         隐含强制类型转换:顾名思义,看不见的强制类型转换,关于这个问题,我们先来读懂一句话:

         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