1、Java中進行混合運算的時候,byte,short,char不會互相轉換,都會自動類型提升爲int類型,其他類型進行混合運算時,小的數據類型提升爲大的數據類型。
下面進行簡單的類型轉換排序:byte,short,char(不互相轉換)-> int -> long -> float -> double
通過上面可以看出在混合運算是long會轉換爲float,而實際上long佔八個字節,float只佔四個字節,那麼到底誰大誰小呢?
class DataTypeConversion{
public static void main(String[] args){
float f = 12.3f;
long l = 12345;
f = l;
System.out.println(f);
}
}
正常輸入12345.0
,可見float是可以存儲long的值的。
class DataTypeConversion{
public static void main(String[] args){
float f = 12.3f;
long l = 12345;
l = f;
System.out.println(l);
}
}
編譯出錯:可能丟失精度。可以通過l = (long)f;
來進行強制轉換,可見long是裝不下float的值的。
2、通過二進制來分析爲什麼八個字節的long比四個字節的float小:
float 佔四個字節:
- 一個字節是八個二進制位,float四個字節相當於32個二進制位
- 最左邊的1位代表的是符號位
- 後面的23位代表尾數位(小數位,最大也無非是無限接近於1,不影響其整個float的取值,可忽略不計)
- 剩下的8位(32 - 1 - 23)就是關鍵的指數位,二進制表示爲:00000000 ~ 111111111 取值範圍爲0 ~ 255,
- 根據IEEE 754規定,其中0代表0,255代表無窮大,去除兩個最值,中間的範圍爲1 - 254,
- 規定每個指數要減去127,所以範圍爲:-126 ~ 127,即 最大值爲
2^127
,遠遠大於long類型的最大值:2^63-1