Day08——强制转换

类型转换

由于 Java 是强类型语言,所以要进行有些运算的时候,需要用到类型转换。

类型的优先级

低----------------------------------------------------------->高

byte,short,char->int->long->float->double

运算中,不同类型的数据先转化为同一类型,然后进行运算。

 //内存溢出
        int i1= 128;
        byte i2=(byte)i1;      //内存溢出——byte类型取值范围是 -128 到 127,超出范围
        //强制转换    (类型)变量名!!!!!    高--->低
        //自动转换                          低--->高
        System.out.println(i1);  //i1=128
        System.out.println(i2);  //i2=-128
        System.out.println("====================================");
        int i3=10;
        double i4=i3;
        System.out.println(i3);
        System.out.println(i4);
        System.out.println("====================================");
        //转换时,浮点数的精度问题
        System.out.println((int)23.7);          //23
        System.out.println((int)-45.89f);       //-45

        /*
        类型转换的注意事项
        1.不能对布尔值转换
        2.不能把数据类型转换为不相干的类型
        3.优先级高转换为低的时候,强制转换
        4.在转换过程中,可能存在精度问题或者数据溢出问题
         */
        System.out.println("====================================");
        char i5='a';
        int i6=i5+1;
        System.out.println((int)i5);       //97
        System.out.println(i6);            //98
        System.out.println((char) i6);     //b

类型转换的注意事项

​ 1.不能对布尔值转换
​ 2.不能把数据类型转换为不相干的类型
​ 3.优先级高转换为低的时候,强制转换
​ 4.在转换过程中,可能存在精度问题或者数据溢出问题

强制类型转换

自动类型转换。

较大的数字计算

//在打出较大数字时,可以用下划线分隔开,下划线不会输出
        int i1=10_0000_0000;         //十亿    每四位数有一个下划线分隔开
        System.out.println(i1);
        System.out.println("========================================");
        //计算问题:每年赚10亿,20年一共赚多少?
        int money=10_0000_0000;
        int years=20;

        int total=money*years;
        System.out.println(total);//-1474836480
        long total2=money*years;  //转换为范围更大的long。
        // 但money*years计算结果已经默认是int类型了,然后再转换为long类型,就有问题了
        System.out.println(total2);//-1474836480
        long total3=money*(long)years;
        System.out.println(total3); //200_0000_0000---------正确计算,先把一个数转换为long类型
        //在 Java 中,当一个 `long` 类型与一个 `int` 类型相乘时,结果为 `long` 类型。
        
        //这是因为在 Java 的运算中,如果参与运算的数据类型不同,会自动进行类型提升,以确保计算的准确性和避免数据丢失。
        // 由于 `long` 类型的取值范围大于 `int` 类型,所以计算结果会被提升为 `long` 类型。

注意点:

  1. 在打出较大数字时,可以用下划线分隔开,下划线不会输出。每四位数有一个下划线分隔开。如:10_0000_0000

  2. long类型与int类型相乘,结果是long类型。

    因为在 Java 的运算中,如果参与运算的数据类型不同,会自动进行类型提升,以确保计算的准确性和避免数据丢失。由于 long 类型的取值范围大于 int 类型,所以计算结果会被提升为 long 类型

    表述范围小的可以自动转换为表述范围大的

    在 Java 中,不同类型的数字进行加减乘除运算时,结果的类型遵循以下规则:
    
    **一、加法(+)**
    
    1. 如果两个操作数中有一个是 `long` 类型,那么结果为 `long` 类型。
       - 例如:`int a = 10; long b = 20; long result = a + b;`,结果 `result` 是 `long` 类型。
    2. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。
       - 例如:`int a = 10; double b = 20.5; double result = a + b;`,结果 `result` 是 `double` 类型。
    3. 否则,如果两个操作数都是 `int`、`short`、`byte`、`char` 类型,结果为 `int` 类型。
       - 例如:`short a = 10; short b = 20; int result = a + b;`,结果 `result` 是 `int` 类型。
    
    **二、减法(-)**
    
    与加法类似:
    
    1. 如果两个操作数中有一个是 `long` 类型,那么结果为 `long` 类型。
    2. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。
    3. 否则,如果两个操作数都是 `int`、`short`、`byte`、`char` 类型,结果为 `int` 类型。
    
    **三、乘法(*)**
    
    1. 如果两个操作数中有一个是 `long` 类型,那么结果为 `long` 类型。
    2. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。
    3. 否则,如果两个操作数都是 `int`、`short`、`byte`、`char` 类型,结果为 `int` 类型。
    
    **四、除法(/)**
    
    1. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。
       - 例如:`int a = 10; double b = 20.5; double result = a / b;`,结果 `result` 是 `double` 类型。
    2. 如果两个操作数都是 `int`、`long`、`short`、`byte`、`char` 类型:
       - 对于整数除法,结果为整数类型,即如果两个操作数都是 `int`,结果为 `int`;如果两个操作数中有一个是 `long`,结果为 `long`。
       - 例如:`int a = 10; int b = 3; int result = a / b;`,结果 `result` 是 `int` 类型,值为 3。`long c = 10L; long d = 3L; long result2 = c / d;`,结果 `result2` 是 `long` 类型。
    
    需要注意的是,整数除法可能会导致精度丢失,因为它会截断小数部分。如果需要精确的除法结果,可以将操作数之一转换为 `double` 类型进行计算。
    
    表述范围小的可以自动转换为表述范围大的
    
 自我测评
 1.将int类型的128转换为byte类型
 2.将char类型的‘a’转换为int类型
 3.计算10亿乘20的准确结果
posted @ 2024-10-02 14:50  1hahahahahahahaha  阅读(3)  评论(0编辑  收藏  举报