
具體自動提升類型如上圖所示。其中long->float的轉換一開始讓我感覺有點問題,因為long是64位的,而float卻是32位的。
遂找尋答案,參考博客java中long到float的自動轉換引發的血案。
原因
首先要知道一點,float能表示的數的范圍比long大,那么可想而知,一個long型數可以轉為float型。
long類型,取值范圍是-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807(-263 ~ 263-1)
float類型,取值范圍是2^(-149) ---> (2-2^(-23))*2^127,也就是Float.MIN_VALUE和Float.MAX_VALUE
任何一個long類型的數字都可以使用float類型的表示方法來表示。但是,由於float有精度限制,所以在轉換的過程中有可能丟失精度,
如3111111111111111L ---->3.1111111E15---->3111111100465152,在轉換回來后就丟失了精度
其次要知道float的32位是如何表示小數的(大學的計算機組成原理課程學過,但忘了,現在學習一下,希望可以記住)。
float內存存儲原理
http://steve.hollasch.net/cgindex/coding/ieeefloat.html(IEEE754標准)
(1)在10進制中123.456可以被表示成1.23456 × 102 ,在二進制中10100.110可以被表示成1.0100110 × 24
(2)浮點數有精度,超過精度的數無法被表示,如0.0000000000000001就是精確到小數點后x位。
(3)IEEE浮點數有三個部分組成:符號位(S),指數位(E),尾部(M),任何數都能以二進制表示以為S*1.M*2E

表示形式如下:
Single: SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM Double: SEEEEEEE EEEEMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM
(4)總結:float的表示范圍為

