1. IEEE754 的雙精度浮點數定義
最高位: 符號
中11位:指數,當它全部位爲1時標識無窮大
android EditText使用指南
低52位:小數
無窮大有2^53個!實際使用時只須要正無窮和負無窮,多出的2^53-2個無窮大提供了不少空間,只須要利用其中的一小部分,就能同時表示指針、整數、還有好多其它東西。
一個雙精度浮點數的二進制表示,以64位整數加法加上 2^48 後,
若最高16位爲0x0000,那它原來最高16位全1,因此全部指數位都是1,也是無窮大
若最高16位爲0x1111,那它原來最高15位全1,因此全部指數位都是1,也是無窮大
2. 有效地址 > FFFF 8000 0000 0000 或者 < 0000 7FFFF FFFF FFFF
以64位整數加法加上 2^48 後,高16位全0
3. webkit 的 js 引擎中,0x0000 區分給指針,0x1111 區分給整數。
Pointer { 0000:PPPP:PPPP:PPPP
/ 0001:****:****:****
Double { ...
\ FFFE:****:****:****
Integer { FFFF:0000:IIII:IIII
相關
商帳追收 Java簡單類型有裝箱和拆箱的區分,增長了編程複雜度和某些狀況的內存消耗,但實現中能夠不用tagged pointer表示原生類型。 Ruby MRI的全部對象都是用tagged pointer表示的。 對於整數,ruby代碼不用區分裝箱來仍是拆箱,運算結果只要是31位之內能夠表示的,就用Fixnum, 不然採用裝箱的Bignum,因此整數和指針都能很好的表示並且不會損失精度。YARV特別優化了整數運算效率,速度甚至能夠和haskell比一下。 可是MRI的浮點數表示老是裝箱類型,致使浮點數值計算的處理效率很是低(有時能夠比C慢100倍以上), rubinius也暫時沒進行優化,至少如今(rubinius1.24)對浮點數的處理比YARV更慢。