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 閱讀(137) 評論(0)  編輯  收藏 所屬分類: 希哈爪哇

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 新龙县| 沭阳县| 于田县| 鄱阳县| 洛阳市| 项城市| 巩留县| 米易县| 侯马市| 桑日县| 尉犁县| 鱼台县| 永胜县| 搜索| 仁寿县| 边坝县| 会昌县| 六枝特区| 汪清县| 太仆寺旗| 台安县| 黑山县| 西宁市| 博白县| 环江| 南丹县| 广东省| 黑山县| 黑水县| 灵丘县| 蓬溪县| 绵阳市| 深泽县| 临湘市| 阿拉善左旗| 巍山| 镇江市| 东兰县| 宝鸡市| 峨山| 新平|