ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[success] # java 类型转换 Java语言中基本数据类型之间的转换方式:`自动类型转换`和`强制类型转换` * `自动类型转换:`主要指从小类型到大类型之间的转换,就是把一个取值范围小的数据或者变量,赋值给另一个取值范围大的变量。此时不需要我们额外写代码单独实现,是程序自动帮我们完成的 1. 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算(取值范围`byte short int long float double`) ![](https://img.kancloud.cn/93/a8/93a842cad7e0f630b41712d0451726a1_1097x201.png) 2. `byte、short、char`三种类型的数据在运算的时候,都会直接先提升为int,然后再进行运算 * `强制类型转换:`主要指从大类型到小类型之间的转换把一个取值范围大的数据或者变量赋值给另一个取值范围小的变量,语法格式如下:`目标类型 变量名 = (目标类型)源类型变量名`,不建议进行类型强制转换 >[danger] ##### 自动类型转换 ~~~ public class TypeConversion { public static void main(String[] args) { byte b1 = 1; // 一个字节 short s1 = 127; // 两个字节 s1 = b1; // 两个字节接受一个字节 // b1 = s1; //一个字节到两个字节报错 错误: 不兼容的类型: 从short转换到byte可能会有损失 System.out.println(b1 + "," + s1); double a = 10; System.out.println(a); // 10.0 小类型像大类型转换 byte b = 100; int c = b; // 可以赋值成功 因byte 小类型转换大类型int隐式转换,不需要我们额外写代码单独实现,是可以直接赋值 System.out.println(c); // 100 int d = 1; long e = 100L; long f = d + e; System.out.println(f); // long 类型大于int 因此int转换为long,最终的结果其实就是两个long相加,那么最终的result是long类型的。 int g = 10; long h = 100L; double i = 20.2; double j = g + h + i; // double 类型最大最后都会转换为double byte k = 10; byte k2 = 20; int k3 = k + k2; // byte,short,char类型的变量在参与运算的时候,变量里面的值会直接先提升为int } } ~~~ >[danger] ##### 强制类型转换 ```java public class OperatorDemo2 { public static void main(String[] args) { double a = 12.3; int b = (int) a; System.out.println(b);//12 } } ``` * **注意点:强制转换有可能会导致数据发生错误。(数据的精度丢失)**,以下面案例为例结果为 `-6,250`,过程 将`short` 强制转换为 byte 类型 变成了`-6`,转换过程首先1个字节等于8位二进制,250转换位short 类型的二进制位`1111 1010`因为short 是两个字节补位`0000 0000 1111 1010` 转换位byte 类型为一个字节从最低位开始算8位二进制`1111 1010`,要记住数字类型首位表示正负,此时`1` 为负数,转换十进制需要`1111 1010` 减1等到`1111 1001 ` 在取反`0000 0110` 在转换十进制等于`6` 在添加符号因此`250` 转换byte 为`-6` ~~~ public class VarTest{ public static void main(String[] args){ byte b1 = 1; // 一个字节 short s1 = 250; // 两个字节 b1 = (byte)s1; System.out.println(b1+","+s1); // -6,250 } } ~~~ >[danger] ##### 编译器优化 * 当 `byte + int` 相加结果还是`int`类型, ` byte + byte \` 相加结果还是`int`类型 ,原因是因为`byte` 类型最大为`127` 往往相加之后很容易超过,因此自动升级为`int` 减法也是一样的,此时`a-b` 已经是int 类型 ~~~ public class VarTest{ public static void main(String[] args){ char a = 1; char b = 2; b = b-a; // 错误: 不兼容的类型: 从int转换到char可能会有损失 } } ~~~