深圳Java培訓:Java中的float在記憶體中的儲存
深圳 Java 培訓: 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/69942977/viewspace-2652480/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java學習路線float在記憶體中的儲存程式設計師Java記憶體
- 深圳軟體測試培訓:java中陣列的操作Java陣列
- 小數在記憶體中是如何儲存的?記憶體
- 【C語言】整型在記憶體中的儲存C語言記憶體
- 記憶體中的資料儲存記憶體
- 3 python的數值在記憶體中如何儲存Python記憶體
- Swift記憶體賦值探索一: 理解物件在記憶體中的儲存狀態Swift記憶體賦值物件
- JVM中java例項物件在記憶體中的佈局JVMJava物件記憶體
- Java培訓教程:Java中的位移運算子!Java
- Java記憶體模型FAQ(九)在新的Java記憶體模型中,final欄位是如何工作的Java記憶體模型
- Java併發中的記憶體模型Java記憶體模型
- Java中的記憶體模型詳解Java記憶體模型
- Java應用程式中的記憶體洩漏及記憶體管理Java記憶體
- 什麼是Java記憶體模型(JMM)中的主記憶體和本地記憶體?Java記憶體模型
- 翻譯 | 理解Java中的記憶體洩漏Java記憶體
- 13 張圖解 Java 中的記憶體模型圖解Java記憶體模型
- Java 執行過程中的記憶體模型Java記憶體模型
- C語言 | 深度剖析資料在記憶體中的儲存(原碼,反碼,補碼,大小端儲存)C語言記憶體
- 深圳java培訓:構建xml文件--【千鋒】JavaXML
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- Java中物件並不是都在堆上分配記憶體的。Java物件記憶體
- Java中字串記憶體位置淺析Java字串記憶體
- Java的記憶體模型Java記憶體模型
- 深圳java培訓:SpringBoot的yml配置及多環境切換JavaSpring Boot
- java開發培訓中訊息中介軟體的優勢有哪些Java
- 深圳軟體測試培訓學習:Java Random介紹--【千鋒】Javarandom
- java中如何檢視記憶體洩露Java記憶體洩露
- 深圳Java培訓:MyBatis為什麼在國內相當流行?【千鋒】JavaMyBatis
- js的陣列/物件在記憶體中分別是如何儲存的?JS陣列物件記憶體
- 深圳Java培訓學習:Java8.0新特性之Lambda表示式Java
- Java培訓:長沙Java培訓機構排名Java
- 深圳Java培訓學習:MyBatis Plus 介紹--【千鋒】JavaMyBatis
- 深圳軟體測試培訓學習:Java連線MySQL--【千鋒】JavaMySql
- Java後端開發崗必備技能:Java併發中的記憶體模型Java後端記憶體模型
- Fdmemtable 記憶體表儲存圖片的例子記憶體
- 武漢Java培訓教程之JDBC中的常用介面和類JavaJDBC
- 如何儲存/恢復Java應用程式核心記憶體資料現場?Java記憶體
- 深圳軟體測試培訓:Postman的Monitor功能Postman