一、自动类型转换
容量小的数据类型可以自动转换成容量大的数据类型,这里的容量指的是基本类型的表数范围而不是占用的存储空间。 如下图所示,黑色的表示无数据丢失的自动类型转型,红色的表示在转型的时候可能会精度丢失(但是编译的时候不会报错)。布尔类型不能做任何的类型转换。
public class TestCast{ public static void main(String[] args){ //整数自动转换 byte b = 2; short s = b; int i = s; long lo = i; System.out.println("b=" + b + " s=" + s + " i=" + i + " lo=" + lo ); //字符转整数 char c = ‘a‘; i = c; System.out.println("c=" + c + " i=" + i); //int转float i = 10; float f = i; System.out.println("i=" + i + " f=" + f); //long转float float f2 = lo; System.out.println("f=" + f2); } }
二、强制类型转换
容量小的能够放进容量大的空间,但是容量大的放进容量小的肯定不行,这就需要将容量大的强制转换成小的才能放进容量小的空间。
强制转型会带来的问题:(1) 可能造成精度降低或者溢出。(2) 如果转换的类型超出目标类型的表数范围,会输出完全不同的值。
//精度丢失 double d = 3.14; //int i = d; //会报 可能损失精度错误 int i = (int) d ; // 强转 System.out.println(i); //输出3,精度丢失 //超过目标类型范围 int i2 = 128; byte b = (byte) i2; System.out.println(b); //输出-128
三、类型提升和溢出问题
1. 表达式中最大的数据类型是决定了表达式最终结果大小的那个类型。若将一个float值与一个double值相乘,结果就是double;如将一个int和一个long值相加,则结果为long。
int a = 1; double b = 2.0; int c = a * b; //会报精度丢失错误,因为a和b相乘后,类型自动提升为double
2. 在操作比较大的数值时,或许值本身没有超过类型的表数范围,但是进行运算后可能就超出了类型的表数范围。这种情况就发生值得溢出,虽然不会报错,但是得到的值并不是我们想要的值。这个时候我们可以将一个值强转成类型大的值。
int a = 1000000000; int b = 3; //int c = a * b; //超出int的表数范围 输出负数 long c = (long) a * b; System.out.println(c);
时间: 2024-10-12 11:13:26