<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)

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    第 3 天的問(wèn)題

    被除數(shù)表示的是一天里的微秒數(shù);而除數(shù)表示的是一天里的毫秒數(shù)。這個(gè)程序會(huì)打印出什么呢?

    
    public class LongDivision{
        public static void main(String args[]){ 
            final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000; 
            final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000; 
            System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY); 
        } 
    } 
    
    

    第 3 天問(wèn)題的解答

    這個(gè)題看起來(lái)相當(dāng)直觀。每天的毫秒數(shù)和每天的微秒數(shù)都是常量。為清楚起見(jiàn),它們都被表示成積的形式。你可能想都沒(méi)想,就脫口而出,結(jié)果是1000。 遺憾的是,它打印的是5。這里到底發(fā)生了什么呢?

    原因

    問(wèn)題在于常數(shù)MICROS_PER_DAY的計(jì)算"確實(shí)"溢出了。盡管計(jì)算的結(jié)果適合放入long中,并且其空間還有富余,但是這個(gè)結(jié)果并不適合放入int中。 這個(gè)計(jì)算完全是以int運(yùn)算來(lái)執(zhí)行的,并且只有在運(yùn)算完成之后,其結(jié)果才被提升到long,而此時(shí)已經(jīng)太遲了:計(jì)算已經(jīng)溢出了, 它返回的是一個(gè)小了200倍的數(shù)值。從int提升到long是一種拓寬原始類型轉(zhuǎn)換(widening primitive conversion), 它保留了(不正確的)數(shù)值。這個(gè)值之后被MILLIS_PER_DAY整除,而MILLIS_PER_DAY的計(jì)算是正確的,因?yàn)樗m合int運(yùn)算。這樣整除的結(jié)果就得到了5

    那么為什么計(jì)算會(huì)是以int運(yùn)算來(lái)執(zhí)行的呢?因?yàn)樗谐嗽谝黄鸬囊蜃佣际莍nt數(shù)值。當(dāng)你將兩個(gè)int數(shù)值相乘時(shí), 你將得到另一個(gè)int數(shù)值。Java不具有目標(biāo)確定類型的特性,這是一種語(yǔ)言特性,其含義是指存儲(chǔ)結(jié)果的變量的類型會(huì)影響到計(jì)算所使用的類型

    解決辦法

    
    public class LongDivision{
        public static void main(String args[ ]){
            final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
            final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000;
            System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
        }
    }
    
    

    通過(guò)使用long常量來(lái)替代int常量作為每一個(gè)乘積的第一個(gè)因子,我們就可以很容易地訂正這個(gè)程序。這樣做可以強(qiáng)制表達(dá)式中所有的后續(xù)計(jì)算都用long運(yùn)作來(lái)完成。 盡管這么做只在MICROS_PER_DAY表達(dá)式中是必需的,但是在兩個(gè)乘積中都這么做是一種很好的方式。相似地,使用long作為乘積的"第一個(gè)"數(shù)值也并不總是必需的, 但是這么做也是一種很好的形式。在兩個(gè)計(jì)算中都以long數(shù)值開(kāi)始可以很清楚地表明它們都不會(huì)溢出。下面的程序?qū)⒋蛴〕鑫覀兯谕?000

    第 3 天問(wèn)題的總結(jié)

    這個(gè)教訓(xùn)很簡(jiǎn)單:當(dāng)你在操作很大的數(shù)字時(shí),千萬(wàn)要提防溢出--它可是一個(gè)緘默殺手。 即使用來(lái)保存結(jié)果的變量已顯得足夠大,也并不意味著要產(chǎn)生結(jié)果的計(jì)算具有正確的類型。當(dāng)你拿不準(zhǔn)時(shí),就使用long運(yùn)算來(lái)執(zhí)行整個(gè)計(jì)算。

    語(yǔ)言設(shè)計(jì)者從中可以吸取的教訓(xùn)是:也許降低緘默溢出產(chǎn)生的可能性確實(shí)是值得做的一件事。這可以通過(guò)對(duì)不會(huì)產(chǎn)生緘默溢出的運(yùn)算提供支持來(lái)實(shí)現(xiàn)。 程序可以拋出一個(gè)異常而不是直接溢出,就像Ada所作的那樣,或者它們可以在需要的時(shí)候自動(dòng)地切換到一個(gè)更大的內(nèi)部表示上以防止溢出,就像Lisp所作的那樣。 這兩種方式都可能會(huì)遭受與其相關(guān)的性能方面的損失。 降低緘默溢出的另一種方式是支持目標(biāo)確定類型,但是這么做會(huì)顯著地增加類型系統(tǒng)的復(fù)雜度


    今天的問(wèn)題

    它又會(huì)打印出什么呢?

    
    public class Elementary{
        public static void main(String[] args){
            System.out.println(12345+5432l);
        }
    }
    
    
    posted on 2008-05-16 23:41 李四飛刀 閱讀(1255) 評(píng)論(1)  編輯  收藏 所屬分類: 每日一題

    FeedBack:
    # re: 第 4 天: 解答 -- 長(zhǎng)整數(shù), 問(wèn)題 -- 眼花繚亂 2008-05-17 00:01 ZelluX
    Java Puzzlers...  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 中文字幕免费视频精品一| 最好2018中文免费视频| 99re6热视频精品免费观看 | 久草免费福利视频| 亚洲成av人片在线观看无码不卡| 国产裸体美女永久免费无遮挡| 亚洲一区二区三区在线播放| 久久久久久噜噜精品免费直播| 久久国产成人精品国产成人亚洲| 一级特级aaaa毛片免费观看| 久久精品国产精品亚洲| 久久精品免费大片国产大片 | 久久亚洲精品国产亚洲老地址 | 无码国产亚洲日韩国精品视频一区二区三区| 亚洲成av人片在www鸭子| 情侣视频精品免费的国产| 无码毛片一区二区三区视频免费播放| 亚洲国产综合久久天堂| 热99RE久久精品这里都是精品免费| 国产AV无码专区亚洲AV毛网站| 久9久9精品免费观看| 亚洲三级在线视频| 日本午夜免费福利视频| GOGOGO高清免费看韩国| 亚洲系列中文字幕| 国产资源免费观看| 国产日韩久久免费影院 | 亚洲人成电影亚洲人成9999网| 在线观看视频免费完整版| 羞羞网站免费观看| 久久亚洲AV午夜福利精品一区| 中文字幕无码视频手机免费看| 美女被免费网站视频在线| 亚洲精品无码Av人在线观看国产| 麻豆视频免费观看| 免费精品久久久久久中文字幕| 亚洲欧洲在线观看| 免费一级毛片在线观看| 99久久久国产精品免费牛牛四川| 亚洲乱码av中文一区二区| 人人狠狠综合久久亚洲婷婷|