BloveSaga

在希腊帕尔纳斯山南坡上,有一个驰名世界的戴尔波伊神托所,在它的入口处的巨石上赫然锈刻着这样几个大字: 认识你自己!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  34 随笔 :: 12 文章 :: 122 评论 :: 0 Trackbacks

  转型用于将一种类型转换到另一种类型.看看下面的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和打印的一样.
   从这个例子我们得到一个教训:
如果通过观察不能确定程序将要做什么,那么它做的就很有可能不是你想要的.

posted on 2006-06-04 16:13 蓝色Saga 阅读(130) 评论(0)  编辑  收藏 所属分类: 希哈爪哇

只有注册用户登录后才能发表评论。


网站导航: