Java 数据类型的转换【强制转换】

1、Java数据类型之强制类型转换

class DataTypeConversion{
	public static void main(String[] args){
		int x = 3;
		byte b = 4;
		b = x + b;
		System.out.println(b);	//输出结果报错,错误:可能损失精度
	}
}

上面代码:输出结果报错,错误:可能损失精度

2、分析原因:

下面是byte bint x的二进制表现形式:
在这里插入图片描述
根据上一篇隐式类型转换可以知道,当我们进行x + b运算的时候,会默认将小的byte类型提升为int类型和x进行计算;
在这里插入图片描述
下面的计算结果为int类型的7
在这里插入图片描述
最后我们将int类型的7赋值给byte类型的b,因为byte类型是1个字节,所以装不下四个字节的int类型的7,这里就报错提示可能损精度。这时我们就用到了强制转换
在这里插入图片描述
我们可以通过下面的代码将int类型的7强制转换为byte类型的7,去掉int类型7前面三个八位,这样就实现了强制转换。

class DataTypeConversion{
	public static void main(String[] args){
		int x = 3;
		byte b = 4;
		b = (byte)(x + b);
		System.out.println(b);	//输出结果为byte类型的7
	}
}

编译通过:输出结果为byte类型的7

3、强制转换过程超出范围

上面是int类型的7转换为byte类型,因为7在byte的取值范围(-128 ~ 127)之内,但是如果强制转换过程中,值超出byte的取值范围如何处理呢?

class DataTypeConversion{
	public static void main(String[] args){
		int x = 126;
		byte b = 4;
		b = (byte)(x + b);
		System.out.println(b);	//输出结果为byte类型的-126
	}
}

上面x + b计算结果为int类型的130,很明显超出了byte类型的范围,结果为-126,我们通过二进制看下原因:

首先我们拿到130的二进制:00000000 00000000 00000000 10000010

我们在转换过程中是将前面三个八位砍掉:10000010

因为计算过程中我们都是通过补码进行计算,所以我们要求出其原码

我们已知负数补码求原码:减一取反

求得原码为:11111110,由此可见该数正好为-126

4、下面我们在举一个强制转换超出范围的例子:

class DataTypeConversion{
	public static void main(String[] args){
		byte b = (byte)300;
		System.out.println(b);	//输出结果为byte类型的44
	}
}

根据上面的思路:

我们已知int类型300的二进制为:00000000 00000000 00000001 00101100

转换为byte类型将前三个八位去掉:00101100

最高位符号位为0,为整数:整数的原反补都一样,所以该数的原码就是00101100,即44

猜你喜欢

转载自blog.csdn.net/weixin_44296929/article/details/106900904