好程式設計師Java學習路線float在記憶體中的儲存
好程式設計師 Java 學習路線 float 在記憶體中的儲存 , 最近在講 Java 基礎,講到資料型別的轉換,提到整數型別長位元組型別資料放到短位元組型別資料中時,由於位元組數不夠,會截斷資料,所以需要程式設計師手動強制型別轉換,例如將 int 型的資料放到 byte 型別中。
後來學生提出一個問題,為什麼 float 只有 4 個位元組,而 long 有 8 個位元組,將一個 long 資料放入到一個 float 中時不需要強制轉換,而將 float 放到 long 中卻需要強制轉換呢?
要理解這個問題,首先我們要知道 float 中可以儲存小數,而 long 只能儲存整數,所有 float 的資料放到 long 裡需要強制轉換。
至於為什麼 long 放到 float 裡不需要強制轉換,需要了解 float 儲存資料的機制, float 中儲存資料的時候是以科學計數法的方式計數的,所有能夠儲存的整數大小要超過 long 型別,於是 long 資料放到 float 中是沒有問題的,只是可能會誤差很大而已。
具體來說, float 中儲存一個數字時,是按照這樣做的:
float 有 4 個位元組,即 32 個 bit
32 31 30-24 23-1
符號位 指數符號位 指數 數字
1. 將 10 進位制的小數轉換成 2 進位制的小數。
2. 將小數點移動(左移或右移 n 位)到第一個數字 1 後,得到一個類似 1.01001 … 這樣的一個二進位制小數 m 。
3. 根據小數的正負將第 32 位(最高位)的符號位填充,正數為 ,負數為 1 。
4. 根據移動的方向確定第 31 位的值,如果向左移則為 1 ,向右移或者不動為 。
5. 如果是向左移,將 n-1 後轉換成 2 進位制,並在左邊補零到 7 位長度,填充到 30-24 位的指數位上。如果是不動或向右移,將 n 轉換成 2 進位制,並在左邊補零到 7 位長度,並每一位求反填充到 30-24 位。
6. 將數字 m 去掉整數位和小數點後,截斷 23 位長度填充到 23-1 位。
例如:數字 12.1
轉換成 2 進位制後為: 1100.0001100110011001100110011001100110011001100110011
將數字往左移 3 位為: 1 . 1000001100110011001100110011001100110011001100110011
因為數字 12.1 為正數,所以 float 的第 32 為 。
因為往左移,所以第 31 位為: 1
因為往左移了 3 位, 3-1=2 ,所以第 30-24 位為: 0000010
最後,將小數點後面的數字截斷 23 位,所以第 23-1 位為: 1000001 10011001 10011001
最終 12.1 表示成 2 進位制在記憶體中儲存為: 0 1 0000010 1000001 10011001 10011001
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2652484/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深圳Java培訓:Java中的float在記憶體中的儲存Java記憶體
- 好程式設計師大資料學習路線之hive儲存格式程式設計師大資料Hive
- 好程式設計師Java學習路線之集程式設計師Java
- 好程式設計師Java學習路線JSP物件程式設計師JavaJS物件
- 好程式設計師Java學習路線分享SpringCloud程式設計師JavaSpringGCCloud
- 好程式設計師Java學習路線分享Java中的位移運算程式設計師Java
- 好程式設計師Java學習路線分享原生Ajax的使用程式設計師Java
- 好程式設計師Java學習路線分享mybatis對映程式設計師JavaMyBatis
- 好程式設計師告訴你Java架構師學習路線程式設計師Java架構
- 好程式設計師Java學習路線之MySQL的執行計劃程式設計師JavaMySql
- 好程式設計師Java學習路線之Java中的物件流和序列化程式設計師Java物件
- 好程式設計師Java學習路線分享Java框架怎麼搭建程式設計師Java框架
- 好程式設計師Java學習路線分享Java-String常用方法程式設計師Java
- 好程式設計師Java學習路線之SpringMVC之基本配置程式設計師JavaSpringMVC
- 好程式設計師Java學習路線分享finalize()方法詳解程式設計師Java
- 好程式設計師Java學習路線分享JVM相關概念程式設計師JavaJVM
- 好程式設計師Java學習路線分享MyBatis之Spring整合程式設計師JavaMyBatisSpring
- 好程式設計師Java學習路線分享Redis快速入門程式設計師JavaRedis
- 好程式設計師Java學習路線分享MyBatis之基本使用程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享maven是什麼程式設計師JavaMaven
- 好程式設計師Java學習路線分享SpringMVC之MVC概述程式設計師JavaSpringMVC
- 好程式設計師Java學習路線分享Java弱引用的理解與使用程式設計師Java
- 好程式設計師大資料學習路線分享Actor學習筆記程式設計師大資料筆記
- 好程式設計師大資料學習路線分享Map學習筆記程式設計師大資料筆記
- 好程式設計師Java學習路線Java bean是個什麼概念程式設計師JavaBean
- 好程式設計師Java學習路線分享三大特性之多型程式設計師Java多型
- 好程式設計師Java學習路線分享Dubbo架構介紹程式設計師Java架構
- 好程式設計師Java學習路線分享多執行緒概念程式設計師Java執行緒
- 好程式設計師Java學習路線分享MySQL目錄結構程式設計師JavaMySql
- 好程式設計師Java學習路線分享Java案例-封裝JDBC工具類程式設計師Java封裝JDBC
- 好程式設計師Java學習路線介紹Java到底是什麼?程式設計師Java
- 好程式設計師Java學習路線分享怎麼理解Java物件導向程式設計師Java物件
- 好程式設計師Java學習路線分享Spring建立Bean的3種方式程式設計師JavaSpringBean
- 好程式設計師Java學習路線分享JavaEE的13種核心技術程式設計師Java
- 好程式設計師Java學習路線分享SpringMVC之請求和響應程式設計師JavaSpringMVC
- 好程式設計師Java學習路線分享如何處理中文引數程式設計師Java
- 好程式設計師Java學習路線分享MyBatis之關聯查詢程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享JVM類載入機制程式設計師JavaJVM