一、自动类型转换
容量小的数据类型可以自动转换成容量大的数据类型,这里的容量指的是基本类型的表数范围而不是占用的存储空间。 如下图所示,黑色的表示无数据丢失的自动类型转型,红色的表示在转型的时候可能会精度丢失(但是编译的时候不会报错)。布尔类型不能做任何的类型转换。
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);