<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 9  文章 - 21  trackbacks - 0
    <2008年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(1)

    隨筆分類(9)

    隨筆檔案(9)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    第 5 天的問題

    下面的程序是對兩個十六進制(hex)字面常量進行相加,然后打印出十六進制的結果。這個程序會打印出什么呢?

    public class JoyOfHex {
        public static void main(String[] args) {
            System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
        }
    }
    

    第 5 天問題的解答

    看起來很明顯,該程序應該打印出1cafebabe。畢竟,這確實就是十六進制數字10000000016與cafebabe16的和。該程序使用的是long型運算,它可以支持16位十六進制數,因此運算溢出是不可能的。

    遺憾的告訴你,結果是cafebabe,并沒有任何前導的1。這個輸出表示的是正確結果的低32位,但是不知何故,第33位丟失了。

    原因

    十進制字面常量具有一個很好的屬性,即所有的十進制字面常量都是正的,而十六進制或是八進制字面常量并不具備這個屬性。

    要想書寫一個負的十進制常量,可以使用一元取反操作符(-)連接一個十進制字面常量。以這種方式,你可以用十進制來書寫任何int或long型的數值,不管它是正的還是負的,并且負的十進制常數可以很明確地用一個減號符號來標識。

    但是十六進制和八進制字面常量并不是這么回事,它們可以具有正的以及負的數值。如果十六進制和八進制字面常量的最高位被置位了,那么它們就是負數。在這個程序中,數字0xcafebabe是一個int常量,它的最高位被置位了,所以它是一個負數。它等于十進制數值-889275714。

    該程序執行的這個加法是一種"混合類型的計算(mixed-type computation)。左操作數是 long 類型的,而右操作數是 int 類型的。為了執行該計算,Java將int類型的數值用拓寬原始類型轉換提升為一個long類型,然后對兩個long類型數值相加。因為int是一個有符號的整數類型,所以這個轉換執行的是符合擴展,它將負的int類型的數值提升為一個在數值上相等的long類型數值。

    解決辦法

    System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));
    

    這個加法的右操作數0xcafebabe被提升為了long類型的數值0xffffffffcafebabeL。這個數值之后被加到了左操作數0x100000000L上。當作為int類型來被審視時,經過符號擴展之后的右操作數的高32位是-1,而左操作數的高32位是1,將這兩個數值相加就得到了0,這也就解釋了為什么在程序輸出中前導1丟失了。

    第 5 天問題的總結

    這個題給我們的教訓是:混合類型的計算可能會產生混淆,尤其是十六進制和八進制字面常量無需顯式的減號符號就可以表示負的數值。為了避免這種窘境,通常最好是避免混合類型的計算

    對于語言的設計者們來說,應該考慮支持無符號的整數類型,從而根除符號擴展的可能性。可能會有這樣的爭辯:負的十六進制和八進制字面常量應該被禁用,但是這可能會挫傷程序員,他們經常使用十六進制字面常量來表示那些符號沒有任何重要含義的數值。


    今天的問題

    轉型被用來將一個數值從一種類型轉換到另一種類型。下面的程序連續使用了三個轉型。那么它到底會打印出什么呢?

    public class Multicast {
        public static void main(String[] args) {
            System.out.println((int) (char) (byte) -1);
        }
    }
    
    
    posted on 2008-05-17 17:52 李四飛刀 閱讀(1587) 評論(2)  編輯  收藏 所屬分類: 每日一題

    FeedBack:
    # re: 第 6 天: 解答 -- 16進制的趣事, 問題 -- 轉型 2008-05-19 12:55 草兒
    你是不是建議我們都去買一本 《Java 解惑》?   回復  更多評論
      
    # re: 第 6 天: 解答 -- 16進制的趣事, 問題 -- 轉型 2008-05-21 16:29 d
    很無聊!!!!!!!,如果你寫過c++,你說的都是入門基礎!  回復  更多評論
      
    主站蜘蛛池模板: 亚洲人成人一区二区三区| 又大又硬又粗又黄的视频免费看| 和日本免费不卡在线v| 欧美日韩国产免费一区二区三区 | 亚洲 欧洲 自拍 另类 校园| 亚洲精品精华液一区二区| 国产一卡2卡3卡4卡2021免费观看 国产一卡2卡3卡4卡无卡免费视频 | 一个人免费视频在线观看www| 亚洲日本中文字幕天堂网| 中文字幕亚洲精品资源网| 久久久国产精品福利免费| 亚洲AV日韩AV天堂一区二区三区| 亚洲综合在线一区二区三区| 免费无码AV片在线观看软件| 亚洲熟伦熟女专区hd高清| 国产成人高清精品免费鸭子 | 亚洲第一成年免费网站| 国产成人精品免费直播| 全部一级一级毛片免费看| 国产日产亚洲系列| 国偷自产一区二区免费视频| 337p日本欧洲亚洲大胆色噜噜| 综合在线免费视频| 久久精品熟女亚洲av麻豆| 亚洲乱码中文字幕手机在线| 亚洲情A成黄在线观看动漫软件| 四虎在线免费播放| 亚洲丝袜中文字幕| 日本高清免费aaaaa大片视频| 亚洲一区二区影院| 中文字幕乱码一区二区免费| 日韩亚洲Av人人夜夜澡人人爽| 丁香花免费完整高清观看| 男女污污污超污视频免费在线看| 亚洲香蕉成人AV网站在线观看| 99视频免费播放| 国产精品亚洲精品日韩电影| 亚洲乱码国产乱码精品精| 精品久久久久久久久免费影院| 国产亚洲精品美女| 亚洲综合无码一区二区|