首页 > 代码库 > 第四篇 基本类型转换

第四篇 基本类型转换

一、自动类型转换

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

技术分享

 

 

 

 

 

 

 

 

 

 

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); 

第四篇 基本类型转换