第四篇 基本类型转换

一、自动类型转换

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

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

转载于:https://www.cnblogs.com/duoluomengxing/p/6516996.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值