public class Demo04 {
    //Java是强类型语言,进行运算时需进行类型转换
    //不同类型的数据要先转换成同一类型再进行运算
    /*数据类型排序(从低到高):
    byte、short、char——>int——>long——>float——>double
    !!long是64,float是32,为何float比long更高?
    ——> 小数的优先级大于整数
     */
    public static void main(String[] args) {
        int i = 123;
        byte b = (byte)i;   //int比byte类型优先级高,所以需要强制转换
        //强制转换:(类型名)变量名
        //自动转换:低类型转换为高类型不需强制转换,所以不需要加(类型名)
        System.out.println(i);
        System.out.println(b);  //输出结果都是123
        System.out.println("==============================");


        //注意点①:强制转换时需要注意内存溢出问题,如:
        int i1 = 128;
        byte b1 = (byte)i1;
        System.out.println(i1);     //输出结果为128
        System.out.println(b1);     //输出结果为-128
        //因为Byte类范围时-128~127,i1的值已经超出范围,所以结果不准确
        System.out.println("==============================");


        //注意点②:不能对布尔值进行转换
        //注意点③:不能把对象类型转换为不相干的类型
        //注意点④:类型转换是可能存在精度问题,如:
        System.out.println((double)25);     //整数类型转换为小数类型(自动转换),结果为25.0
        System.out.println((int)24.99);     //小数类型转换为整数类型(强制转换),结果为24
        System.out.println("==============================");


        char c = 'a';
        int i2 = c+1;
        System.out.println(i2);     //输出结果为98
        //因为根据char涉及的Unicode编码表,'a'表示的数就是97
        System.out.println((char)i2);       //输出结果为b
        System.out.println("==============================");


        //操作比较大的数时,注意溢出问题
        int money = 10_0000_0000;   //JKD7以上新特性,数字之间可以用下划线分割且不会输出
        int years = 20;
        int total = money*years;
        System.out.println(total);      //输出结果为-1474836480,超出int范围,溢出

        //下面使用long类型再输出:
        long total2 = money*years;
        System.out.println(total2);     //输出结果还是-1474836480 ???
        //money*years计算完后默认是int类型,即在转换成long之前就已经计算完了

        //正确转换方法如下:
        long total3 = money*((long)years);      //先把一个数转化为long
        System.out.println(total3);     //输出结果为20000000000

    }
}