一、什么是自动类型转换
-
类型范围小的变量,可以直接赋值给类型范围大的变量
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、自动类型转换是什么样的?
- 类型范围小的变量,可以直接赋值给类型范围大的变量
- 中间不需要咱做任何处理,是自动发生的