第四篇 基本类型转换

一、自动类型转换

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

image

 

 

 

 

 

 

 

 

 

 

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); 
posted @ 2017-03-07 21:44  堕落梦醒  阅读(118)  评论(0编辑  收藏  举报