疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

基本数据类型转换(2)—[疯狂java讲义]


 

强制类型转化
         如果希望把图3.9中箭头右边的类型转换为左边的类型,则必须使用强制类型转换,强制类型转换的语法格式是:(targetType)value,强制类型转换的运算符是圆括号(())。当进行强制类型转换时,类似于把一个大瓶子里的水倒入一个小瓶子,如果大瓶子里的水不多还好,但如果大瓶子里的水很多,将会引起溢出,从而造成数据丢失。这种转换也被称为“缩小转换(Narrow Conversion) ”。
        下面程序示范了强制类型转换的示例:
程序清单:codes/03/3-5/NarrowConversion.java
public classNarrowConversion
{
public static void main(String[] args)
{
int iValue=233;
//强制把一个int类型的值转换为byte类型的值
byte bValue=(byte)iValue;
//将输出-23
System.out.println(bValue);
double dValue=3.98;
//强制把一个double类型的值转换为int
int tol=(int)dValue;
//将输出3
System.out.println(tol);
}
}
         在上面程序中,把一个浮点数强制类型转换为整数时,Java将直接截断浮点数的小数部分。除此之外,上面程序还把一个233强制类型转换为byte型整数,从而变成了一23,这就是典型的溢出。图3.10示范了这个转换过程:
         从图3.10中可以看出,32位int型的233在内存中如图3.10上面所示,强制类型转换为8位的byte类型,则需要截断前面24位,只保留右边8位,此处最左边的1是一个符号位,此处表明这是一个负数,负数在计算机里是以补码的形式存在的,因此还需要换算成原码。将图3.10所示的第二个数换算成原码的过程如图3.11所示。
        提示:有数字在计算机底层都是以2进制形式存在的,原码就是直接将一个10进制数换算成2进制数。但计算机以补码的形式保存所有的整数。补码的计算规则如下:正数的完全相同,负数的补码是其反码加1;反码是对原码按位取反,除了最高位(符号位)保持不变。
         从图3.11中可以看出,最后的二进制原码为10010111,这个byte型的值为一(16+4+2+1),也就是-23。
         从图3.10很容易看出,当试图强制把表数范围大的类型转换表数范围小的类型时,必须格外小心,因为非常容易引起信息丢失。(未完.摘自[疯狂java讲义].李刚)