試着編譯運行下面的幾行小程序:
正常編譯後,運行發生了異常,程序被終止運行,啥也沒打印出來。當然問題也是顯然的,嚴重的除0異常。(沒有人會寫程序故意除以一個零,但難保來自於其它輸入渠道的數據不會導致一個0除數。這裏只是個例子,就簡單寫寫了。)
我們再把程序稍微改動一點:
只有一處改動:被除數由“3”變成“3.0”。
結果卻有所不同。當然,要說不正常結果依舊是不正常。但這次卻不是嚴重的終止了程序的運行時異常,程序本身是正常運行的,而且有結果輸出,只不過輸出了一個怪怪的東西,標示這個浮點數有問題。
前後的區別在於:在第一種情況下,是兩個整數相除,當除數爲0時產生一個嚴重的除0異常,程序被終止運行;在第二種情況下,由於除法運算的第一個操作數爲double型,那麼除數a也被先提升爲double型然後參與運算。浮點運算中,除0錯誤的結果不是一個運行時異常,而是得到一個“Not A Number”的特殊浮點值作爲結果,當這個值被打印時就輸出了那個怪怪的東西。
可以聯想到的一件事情是:float/double類型是有這種特殊值的,這一點不像各種int類型。一個int,32個bit,不管怎麼組合,其結果都是一個合法的int值。但float/double不同,float的32個bit或者double的64個bit,並非每種組合都是合法的。因此通過某種方式隨意組織32個bit,來試圖形成一個“float隨機數”的想法是不正確的。