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

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    第 3 天的問題

    被除數表示的是一天里的微秒數;而除數表示的是一天里的毫秒數。這個程序會打印出什么呢?

    
    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 天問題的解答

    這個題看起來相當直觀。每天的毫秒數和每天的微秒數都是常量。為清楚起見,它們都被表示成積的形式。你可能想都沒想,就脫口而出,結果是1000。 遺憾的是,它打印的是5。這里到底發生了什么呢?

    原因

    問題在于常數MICROS_PER_DAY的計算"確實"溢出了。盡管計算的結果適合放入long中,并且其空間還有富余,但是這個結果并不適合放入int中。 這個計算完全是以int運算來執行的,并且只有在運算完成之后,其結果才被提升到long,而此時已經太遲了:計算已經溢出了, 它返回的是一個小了200倍的數值。從int提升到long是一種拓寬原始類型轉換(widening primitive conversion), 它保留了(不正確的)數值。這個值之后被MILLIS_PER_DAY整除,而MILLIS_PER_DAY的計算是正確的,因為它適合int運算。這樣整除的結果就得到了5

    那么為什么計算會是以int運算來執行的呢?因為所有乘在一起的因子都是int數值。當你將兩個int數值相乘時, 你將得到另一個int數值。Java不具有目標確定類型的特性,這是一種語言特性,其含義是指存儲結果的變量的類型會影響到計算所使用的類型

    解決辦法

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

    通過使用long常量來替代int常量作為每一個乘積的第一個因子,我們就可以很容易地訂正這個程序。這樣做可以強制表達式中所有的后續計算都用long運作來完成。 盡管這么做只在MICROS_PER_DAY表達式中是必需的,但是在兩個乘積中都這么做是一種很好的方式。相似地,使用long作為乘積的"第一個"數值也并不總是必需的, 但是這么做也是一種很好的形式。在兩個計算中都以long數值開始可以很清楚地表明它們都不會溢出。下面的程序將打印出我們所期望的1000

    第 3 天問題的總結

    這個教訓很簡單:當你在操作很大的數字時,千萬要提防溢出--它可是一個緘默殺手。 即使用來保存結果的變量已顯得足夠大,也并不意味著要產生結果的計算具有正確的類型。當你拿不準時,就使用long運算來執行整個計算。

    語言設計者從中可以吸取的教訓是:也許降低緘默溢出產生的可能性確實是值得做的一件事。這可以通過對不會產生緘默溢出的運算提供支持來實現。 程序可以拋出一個異常而不是直接溢出,就像Ada所作的那樣,或者它們可以在需要的時候自動地切換到一個更大的內部表示上以防止溢出,就像Lisp所作的那樣。 這兩種方式都可能會遭受與其相關的性能方面的損失。 降低緘默溢出的另一種方式是支持目標確定類型,但是這么做會顯著地增加類型系統的復雜度


    今天的問題

    它又會打印出什么呢?

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

    FeedBack:
    # re: 第 4 天: 解答 -- 長整數, 問題 -- 眼花繚亂 2008-05-17 00:01 ZelluX
    Java Puzzlers...  回復  更多評論
      
    主站蜘蛛池模板: 亚洲AV无码一区二区三区人| 老司机午夜在线视频免费观| a在线观看免费视频| 精品国产污污免费网站| 一二三四视频在线观看中文版免费 | jlzzjlzz亚洲jzjzjz| 无码精品国产一区二区三区免费| 国产又大又长又粗又硬的免费视频| 日韩一级视频免费观看| 久久99国产亚洲高清观看首页| 亚洲va在线va天堂成人| 女人毛片a级大学毛片免费| 亚洲精品中文字幕乱码三区 | 亚洲综合激情视频| 久久九九兔免费精品6| 国产成人精品日本亚洲网址| 女人与禽交视频免费看| 人与动性xxxxx免费| 成年丰满熟妇午夜免费视频| 亚洲精品国产suv一区88| 日本一卡精品视频免费| va天堂va亚洲va影视中文字幕| 成人片黄网站色大片免费| 羞羞漫画小舞被黄漫免费| 亚洲日本一区二区三区在线| 久久综合给合久久国产免费| 亚洲国产精品成人AV在线 | 久久亚洲国产午夜精品理论片 | 日韩免费一级毛片| 免费一级毛suv好看的国产网站 | 日韩精品无码免费一区二区三区 | 亚洲视频在线免费观看| 久久久受www免费人成| 亚洲Av无码乱码在线播放| 亚洲6080yy久久无码产自国产| 又黄又爽又成人免费视频| 国产av无码专区亚洲av毛片搜| 日本午夜免费福利视频| 中文字幕久无码免费久久| 亚洲色大成网站WWW久久九九| 蜜臀98精品国产免费观看|