Posted on 2006-06-27 17:02
多力宇扬 阅读(177)
评论(0) 编辑 收藏 所属分类:
Core Java
转型用于将一种类型转换到另一种类型.看看下面的code运行后你猜会打印什么?
public class Multicast
{
public static void main(String[] args)
{
System.out.println((int)(char)(byte)-1);
}
}
转,转,转,我给转晕了,从int数值-1开始,然后从int转换为byte,之后转为char,最后转型回int.第一个转型将数值从32为窄化到8位,第二个转型从8位拓宽为16位,最后从16位拓宽到32位.这个数值最终回到起点了吗?运行一看不就知道了吗?
Print:
F:\Java Develop>javac Multicast.java
F:\Java Develop>java Multicast
65535
啊,这么会是65535?
oh,my god!有条规则: 如果最初的数值类型是有符号的,那么就执行符号扩展;如果他是char,那么不管它将要被转换成什么类型,都执行另扩展.
用这条规则来44看.因为byte是有符号的,所以在将byte数值-1转换成char时.会发生符号扩展.作为结果的char数值16位就都被置位了,因此它等于2^16-1(2的16次方减1),就是65535.从char到int的转型也是一个扩展,
用规则来说它将执行另扩展,而不是符号扩展.作为int的结果数值就是65535和打印的一样.
从这个例子我们得到一个教训:如果通过观察不能确定程序将要做什么,那么它做的就很有可能不是你想要的.