18-Java基础:类型转换:自动类型转换、表达式的自动类型提升

一、什么是自动类型转换

  • 类型范围小的变量,可以直接赋值类型范围大的变量

    package com.app.type;
    
    public class TypeDemo1 {
        public static void main(String[] args) {
            // 目标:掌握自动类型转换
            System.out.println("--------byte 转换 int");
            byte a = 20;    // 1个字节=8位
            // 发生了自动类型转换
            int b = a;      // 4个字节=32位
            System.out.println(a);
            System.out.println(b);
    
            System.out.println("--------int 转换 double");
            int age = 35;   // 4个字节=32位
            //自动类型转换
            double c = age; // 8个字节=64位
            System.out.println(age);
            System.out.println(c);
    
            System.out.println("-------char 转换 int");
            char ch = 'a';  // 2个字节=16位,字符a的ASCII码是97,转二进制就是:01100001
            int d = ch;     // 4个字节=32位,字符 a 自动转换成 int 后就是:   00000000 00000000 00000000 01100001
            System.out.println(ch);
            System.out.println(d);
        }
    }
    
    输出结果:
    --------byte 转换 int
    20
    20
    --------int 转换 double
    35
    35.0
    -------char 转换 int
    a
    97
    
    
  • 自动类型转换的底层原理

在这里插入图片描述

  • 自动类型转换的其他方式

在这里插入图片描述

  • 可以看到:long类型是64位,float是32位,为什么long 可以自动转换成 float 呢?
    • 简单来说是因为float是浮点类型,是用科学计数法存储的;long是整数类型,是用二进制存储的。所以float类型所能表示的数要远远大于long类型,所以long类型可以自动转换成float类型

二、表达式的自动类型转换

  • 在表达式中,小范围类型的变量会自动转换成当前较大范围的类型再运算

在这里插入图片描述

  • 注意事项

    • 表达式的最终结果类型由表达式中的最高类型决定
    • 在表达式中,byte、short、char直接转成int类型 参与运算的。
    package com.app.type;
    
    public class TypeDemo2 {
        public static void main(String[] args) {
            // 目标:掌握表达式的自动类型转换的规则
            // 1.表达式的最终结果类型由表达式中的最高类型决定
            byte a = 10;    //整数型:1字节
            int b = 20;     //整数型:4字节
            double c = 1.5; //浮点型(小数):8字节
    //        byte result = a + b + c;    // 报错
    //        int result2 = a + b + c;    // 报错
            double result3 = a + b + c; // 属于表达式中最高类型
            System.out.println(result3);    // 输出结果
    
    //        byte result4 = a + b + 3.5;  // 报错
    //        int result5 = a + b + 3.5;   // 报错
            /*
                a=10; b=20;
                因此 a 与 b 都属于整数类型,默认类型是int
                但是表达式中出现了一个小数:3.5,属于浮点型,默认类型是double
                因此表达式 a + b - 3.5 中最高类型是double
             */
            double result6 = a + b - 3.5;
            System.out.println(result6);
    
            // 面试题: 问下列程序是否有问题?
            // 2.在表达式中,byte、short、char 是直接转成int类型参与运算的
            byte d = 10;
            byte e = 20;
            /*
                因为变量 d和e 属于byte类型
                由于byte、short、char这些类型都是直接转成int类型参与运算的
                所以下列程序会报错
             */
    //        byte result7 = d + e;   // 报错
            int result7 = d + e;
            System.out.println(result7);
        }
    }
    
    输出结果:
    31.5
    26.5
    30
    
    

三、强制类型转换

先看看这样的情况

int a = 功能1();				int a = 20;
功能2(byte b);				byte b = a;

问题

  • 类型范围大的数据或者变量,不能直接赋值类型范围小的变量,会报错

什么是强制类型转换

  • 可以强行类型范围大的变量、数据赋值给类型范围小的变量

    数据类型 变量2 = (数据类型)变量1、数据
    
    package com.app.type;
    
    public class TypeDemo3 {
        public static void main(String[] args) {
            // 目标:掌握强制类型转换
            // 1.定义int类型的变量a,初始值为20,赋值给byte类型的变量b
            int a = 20;
    //        byte b = a; // 报错
            byte b = (byte)a;   // 强制将int类型的变量、数据赋值给byte类型的变量b
            System.out.println(a);
            System.out.println(b);
    
            System.out.println("-----强制转换可能造成数据(丢失)溢出-----");
            int c = 1500;
    //        byte d = c; // 报错
            byte d = (byte) c;
            System.out.println(c);
            System.out.println(d);
    
            System.out.println("-----浮点型转成整型,会直接丢掉小数点后的部分,保留整数部分-----");
            double score = 98.7;
            int studyScore = (int) score;
            System.out.println(score);
            System.out.println(studyScore);
        }
    }
    
    输出结果:
    20
    20
    -----强制转换可能造成数据(丢失)溢出-----
    1500
    -36
    -----浮点型转成整型,会直接丢掉小数点后的部分,保留整数部分-----
    98.7
    98
    
    

强制类型转换的底层原理

在这里插入图片描述

  • 1代表符号位是负数,0代表符号位是正数
  • 强制类型转换可能会造成数据(丢失)溢出
  • 浮点型转成整数型,会直接丢掉小数部分,保留整数部分返回

四、总结

自动类型转换

1、表达式的自动类型转换是什么样的?

  • 小范围的类型会自动转换为大范围的类型进行运算

2、表达式的最终结果类型是由什么决定的?

  • 最终结果类型由表达式中的最高类型决定的

3、表达式中有哪些类型转换是需要注意的?

  • byte、short、char这些类型是直接转换成int类型参与表达式运算的
强制类型转换

1、什么是强制类型转换?

  • 可以强行将类型范围大的变量、数据赋值给类型范围小的变量

  • 数据类型 变量 = (数据类型)变量、数据;

    例如:

    int a = 290;
    byte b = (byte) a;
    

2、强制类型转换有哪些需要注意的?

  • 强制类型转换可能会造成数据(丢失)溢出
  • 浮点型转成整数型,会直接丢掉小数部分,保留整数部分返回
表达式的自动类型提升

1、为什么要进行类型转换?

  • 因为程序开发中会存在不同类型的变量赋值给其它类型的变量

  • 例如:

    byte a = 100;
    int b = a;	// 将byte a变量的值赋值给 int b变量
    

2、自动类型转换是什么样的?

  • 类型范围小的变量,可以直接赋值类型范围大的变量
  • 中间不需要咱做任何处理,是自动发生的

多敲多思考,举一反三!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值