010_类型提升问题

一、概念部分

  自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型。这里的容量指一个类型的表述范围、如char(-27~27-1  -128~127)

  强制类型转换:又被称为造型,用于显式的转换一个数值的类型、在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。

  强制类型转换需要注意的是:当一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同的值。如 : char c=(char) -3;

二、转换概念图

  

 三、测试类型  

public class TestClassCase {

    public static void main(String[] args) {
        //[√]因为123在byte这个类型的表述范围(-128~127)所以可以自动类型转换
        byte a=123;
        //[X]因为300不在byte这个类型的表述范围(-128~127)所以编译错误
        //byte b=300;
        //[X]因为-3不在char这个类型的表述范围(0~65535)所以编译错误
        //char c=-3;
        //[√]
        char d='a';
        //[√]
        int e=d;
        //[√]
        long f=123213;
        float g=f;
        //测试强制类型转换
        int h=-100;
        //因为-100不在char这个类型的表述范围(0~65535)所以此处强制类型转换压制了编译错误、致使程序实际运行时将该-100截断为一个完全不同的值
        char i=(char)h;
        //类型自动提升问题
        long j=123;
        int k=2;
         //int l=j+k;//(此处报编译错误、因为a+b之后类型自动提升为long类型、将一个long类型赋值给一个int类型时编译错误
         int money = 1000000000;  //10亿
        int years = 20;
        /*
         * 返回的是负数、要想结果正确必须将其中一个转换为long类型、这里不可(long)(money*years)
         * 因为money*years的值已经超出了int型的表述范围、本身已经溢出了、对一个已经溢出的做强转没有任何意义
         * 为了结果正确、我们将money强转为long类型
         */
        long total = (long)money*years;
        long times = 70L*60*24*365*70;//
        System.out.println("d="+d);
        System.out.println("e="+e);
        System.out.println("g="+g);
        System.out.println("i="+i);//被截断为一个无意义的值
        System.out.println("total="+total);
    }

}

测试结果:

四、总结

  a)做所有的二元运算符(+-/*%),都会有类型提升的问题!比如  一个int型(+、-、*、/、%)一个long类型、其运行结果会自动提升为(其中最高的类型)long类型

    比如: long a=123; int b=2;     int c=a+b;(此处报编译错误、因为a+b之后类型自动提升为long类型、将一个long类型赋值给一个int类型时编译错误)

如有任何疑问可联系邮箱: 给我发邮件、或直接联系QQ:1584875179 || 点返回首页

原文地址:https://www.cnblogs.com/aeon/p/9786264.html