数据类型转换及注意事项(溢出)

数据类型转换及注意事项

/*
因为java是强类型语言,所以在运算的时候要先进行类型转换
低容量------------------------------------→高容量
byte--short--char--→int--→long--→float--→double
运算中,不同类型先转化同类型再进行计算
 */
//自动类型转换,低到高(低赋值给高)
//强制类型转换,高到低(高赋值给低)

public class demo4 {
    public static void main(String[] args) {
        //类型转换举例
        int a1 = 133;
        byte a2 = (byte)a1; //高到低,强制转换,存在溢出
                /*int类型的a1强制转换为byte类型,因为int的容量大于bte,高到低强转。
                但是133超出bte的容量范围,因此存在溢出的问题。打印结果为-123,是有问题的。因此要考虑溢出的问题*/
        System.out.println(a2);

        double a3 = a1; //int--→double,低到高,自动转换,不需要加任何操作
        System.out.println(a3); //打印输出133.0
        /*注意点:
        1、不能对boolean值进行转换;
        2、不能把对象类型转换为不相干类型;
        3、在把高容量转换到低容量的时候强制转换;
        4、转换的时候可能存在溢出(上面的int强制转换为byte类型的例子),或者精度问题
        */
        System.out.println("=============精度问题=================");
        System.out.println((int)125.34); //125 double或者float强制转换为int时,存在精度丢失的问题。
        System.out.println((int)111.2f);    //111 精度丢失
        System.out.println("======================================");
        char b1 = 'a';
        int b2 = b1 + 1;
        System.out.println(b2); // 打印输出为98,因为字符a对应编码表数字97,所以b2=98
        System.out.println((char)b2);   //高到低,强制转换。打印为b,因为字符a+1为b
        System.out.println("===================操作比较大的数时注意溢出===================");
        int money = 10_0000_0000;    //jak7新特性,数字间可用下划线分割
        int years = 20;
        int total1 = money*years;
        System.out.println(total1); //-1474836480 int的最大容量21亿,超出容量,所以出错
        long total2 = money*years;
        System.out.println(total2); // -1474836480 total2把total2转换为long型,没超出容量为什么还是不对呢,
                                    // 这是因为money和years都是int,在total2为long型之前,就已经溢出。
        //正确做法,将money或者years先提前转换为long,此时不会存在溢出的问题,如下:
        long total3 = money*(long)years;
        System.out.println(total3); //打印输出20000000000

    }
}



posted @ 2021-08-20 17:04  forward-ht  阅读(317)  评论(0编辑  收藏  举报