Java中float類型的範圍及其與十六進制的轉換方法

float佔用4個字節,和int是一樣,也就是32bit。

Java中float類型的範圍及其與十六進制的轉換方法

第1個bit表示符號,0表示正數,1表示負數,這個很好理解,不用多管。

第2-9個bit表示指數,一共8爲(可以表示0-255),這裏的底數是2,爲了同時表示正數和負數,這裏要減去127的偏移量。這樣的話範圍就是(-127到128),另外全0和全1作爲特殊處理,所以直接表示-126到127。

剩下的`23位表示小數部分,這裏23位表示了24位的數字,因爲有一個默認的前導1(只有二進制纔有這個特性)。

最後結果是:(-1)^(sign) * 1。f * 2^(exponent)

這裏:sign是符號位,f是23bit的小數部分,exponent是指數部分,最後表示範圍是(因爲正負數是對稱的,這裏只關心正數)

2^(-126) ~~ 2(1-2^(-24)) * 2^127

這個還不是float的取值範圍,因爲標準中還規定了非規格化表示法,另外還有一些特殊規定。

  非規格化表示:

當指數部分全0而且小數部分不全0時表示的是非規格化的浮點數,因爲這裏默認沒有前導1,而是0。

取值位0。f * 2^(-126),表示範圍位 2^(-149)~~ (1-2^(-23)) * 2^(-126) 這裏沒有考慮符號。這裏爲什麼是-126而不是-127? 如果是-127的話,那麼最大表示爲

2^(-127)-2^(-149),很顯然2^(-127) ~~2^(-126) 就沒法表示了。

  其他特殊表示

1。當指數部分和小數部分全爲0時,表示0值,有+0和-0之分(符號位決定),0x00000000表示正0,0x80000000表示負0。

2。指數部分全1,小數部分全0時,表示無窮大,有正無窮和負無窮,0x7f800000表示正無窮,0xff800000表示負無窮。

3。指數部分全1,小數部分不全0時,表示NaN,分爲QNaN和SNaN,Java中都是NaN。

結論:

可以看出浮點數的取值範圍是:2^(-149)~~(2-2^(-23))*2^127,也就是Float。MIN_VALUE和Float。MAX_VALUE。