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 b
和int 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