public class DataTypeConversion {
public static void main(String[] args) {
int largeNumber = 200;
byte smallNumber;
smallNumber = (byte) largeNumber;
System.out.println("转换前的 int 类型值: " + largeNumber);
System.out.println("转换后的 byte 类型值: " + smallNumber);
}
}
数据丢失原因
- 数据范围差异:
int
类型占据4个字节(32位),可以表示的范围是 -2147483648 到 2147483647 ,而byte
类型只占据1个字节(8位),能表示的范围是 -128 到 127 。
- 截断操作:当把
int
类型强制转换为byte
类型时,Java会直接截断int
类型数据的高位字节,只保留低8位。例如上述代码中,int
类型值200的二进制表示为00000000 00000000 00000000 11001000
,转换为byte
时,只保留低8位11001000
,这在有符号数中表示为 -56 ,导致数据丢失。
避免方法
- 范围检查:在进行强制类型转换之前,先检查
int
值是否在byte
类型的范围内。如果在范围内再进行转换,就可以避免数据丢失。
public class DataTypeConversion {
public static void main(String[] args) {
int largeNumber = 200;
if (largeNumber >= Byte.MIN_VALUE && largeNumber <= Byte.MAX_VALUE) {
byte smallNumber = (byte) largeNumber;
System.out.println("转换后的 byte 类型值: " + smallNumber);
} else {
System.out.println("数值超出 byte 类型范围,无法安全转换");
}
}
}
- 使用包装类:使用
Byte
包装类的valueOf(int)
方法,该方法会自动进行范围检查,如果超出范围会抛出NumberFormatException
异常,这样可以通过捕获异常来处理转换失败的情况。
public class DataTypeConversion {
public static void main(String[] args) {
int largeNumber = 200;
try {
Byte smallNumber = Byte.valueOf((byte) largeNumber);
System.out.println("转换后的 byte 类型值: " + smallNumber);
} catch (NumberFormatException e) {
System.out.println("数值超出 byte 类型范围,无法安全转换");
}
}
}