Java long和float的取值範圍誰大誰小

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章