java语言有两种类型转换方式:自动类型转换和强制类型转换
一、自动类型转换
如果系统支持把某种基本数据类型的值直接赋给另一种基本类型的变量,则这种方式被称为自动类型转换。当一个表数范围小的数值或变量直接赋给另一个表数范围大的变量时,系统将可以进行自动类型转换。如图:
例如:
public class PrimitiveandString
{
public static void main(String[] args)
{
//下面代码错误,因为8是一个整数,不能赋给一个字符串
//String str = 5;
//一个基本类型的值和一个字符串连接运算时,基本类型的值会自动转换成字符串
String str2 = 3.5 + "";
//下面输出3.5
System.out.println(str2);
//下面输出7Hello ,因为先运算3 + 4 =7
System.out.println(3 + 4 + "Hello");
//下面输出Hello34,字符串先与3运算,再与4运算
System.out.println("Hello" + 3 + 4);
}
}
二、强制类型转换
当试图强制把表数范围大的类型转换成表数范围小的类型时,可能会引起溢出,从而造成数据丢失,所以必须格外小心。例如:
public class NarrowConversion
{
public static void main(String[] args)
{
int iValue = 233;
//强制把一个int类型的值转换成byte类型的值
byte bValue = (byte) iValue;
//输出-23,因为发生溢出
System.out.println(bValue);
}
}
分析:
233的32位int类型表示为:{00....000} 11101001
8位byte类型的表示: 11101001 (在计算机中为补码表示形式)
将32位int类型的233强制转换成8位的数值,则需要截断前面的24为,只保留右边8位,其中最左边的1是符号位,此处表明是一个负数,负数在计算机里以补码形式存在,因此还要换算成原码。过程如下:
补码:11101001
反码:11101000 (将补码减1得到反码)
原码:10010111 (即-23) (符号位不变,其他取反得到原码)
补充:原码是直接将一个数值换算成二进制数。但计算机以补码形式保存所有数据。补码计算规则:正数的补码和原码完全相同,负数的补码是其反码加1;反码是对原码按位取反,符号位保持不变。