您好,登錄后才能下訂單哦!
本篇內容介紹了“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
“Java中float在內存中的存儲方式是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。