Java中8位十六進制浮點數的轉換例子

1.整型

在一臺典型的32位機器上一個有符號的int型的取值範圍爲-2147483648 ~ 2147483647(-2^31 ~ (2^31-1))。也就是說,在一個4字節(32位2進制),除去首位用於符號位表示正負外,其餘的31位都是數字的有效位。

2.單精度浮點相關介紹

  • float是單精度浮點型數據,所佔字節數爲4位,也就是32個比特。
  • float佔用4個字節和int是一樣,也就是32bit。
  • 第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)
    最大值是:2^128-1
    這裏:sign是符號位,f是23bit的小數部分,exponent是指數部分,最後表示範圍是(因爲正負數是對稱的,這裏只關心正數。)
    2^(-126) ~~ 2(1-2^(-24)) * 2^127
    這個還不是float的取值範圍,因爲標準中還規定了非規格化表示法,另外還有一些特殊規定。
    

    V=(-1)^s * M * 2^E (公式1)
    (1)(-1)^s表示符號位,當s=0,V爲正數;當s=1,V爲負數。
    (2)M表示有效數字,大於等於1,小於2。
    (3)2^E表示指數位。
    對於32位的float,s佔1位,E佔8位,M佔32位,

    32 32 22-0
    s E M

說明:

(1)E不全爲0或不全爲1。這時,浮點數就採用上面的規則表示,即指數E的計算值減去127(32位)(或1023(64位)),得到真實值,再將有效數字M前加上第一位的1。
(2)E全爲0。這時,浮點數的指數E等於1-127(或者1-1023),有效數字M不再加上第一位的1,而是還原爲0.xxxxxx的小數。這樣做是爲了表示±0,以及接近於0的很小的數字。(這是因爲在計算機內部保存M時,默認這個數的第一位總是1,因此可以被捨去,只保存後面的xxxxxx部分。比如保存1.01的時候,只保存01,等到讀取的時候,再把第一位的1加上去。這樣做的目的,是節省1位有效數字。以32位浮點數爲例,留給M只有23位,將第一位的1捨去以後,等於可以保存24位有效數字。)
(3)E全爲1。這時,如果有效數字M全爲0,表示±無窮大(正負取決於符號位s);如果有效數字M不全爲0,表示這個數不是一個數(NaN)。

int a = 3490593;
float b = (float)a;

那麼在內存中a和b究竟存放的是什麼值呢?

將a展開爲二進制,其值爲0000 0000 0011 0101 0100 0011 0010 0001,其十六進制即爲0x00354321。因爲要轉化爲float型,所以首先要對上述二進制的表示形式改變爲 M * 2^E 的形式。由於該數明顯大於1,所以按照IEEE的標準,其浮點形勢必然爲規格化值。
因此 ,轉化後的形式爲:
a = 1.101010100001100100001 * 2^21
根據規格化值的定義M = 1 + f。所以f = 0.101010100001100100001。
因爲float型變量的小數域一共23位。
所以b的最後23位可以得出,其值爲101 0101 0000 1100 1000 0100。
下面再演繹指數域的值:因爲a的指數表示法中,指數E = 21。根據公式,e = E + (2^7 -1) = 148.所以可以得出b的指數域的二進制表示爲:10010100。在加上原數爲正,所以符號位s=0。
所以,可以得出b的二進制表示爲0 10010100 10101010000110010000100。轉化爲十六位進制則是0x4A550C84。換句話說,它存儲在內存中的值是與a是完全不同的。但是其間還是有關聯性的——a的首位爲1的數值位後的二進制表示是與b的小數域完全相同的。

結論:

float從左到右,第一位是符號位,2-9位共8位表示整數位,2的8-1次方等於128,後面23位是表示小數的,所以最大值是2^128-1。
double從左到右,第一位是符號位,2-12是共11位表示整數位,2的11-1次方等於1024。剩餘20位表示小數,所以最大值是2^1024-1。
可以看出浮點數的取值範圍是:2^(-149)~~(2-2^(-23))*2^127,也就是也就是Float.MIN_VALUE和Float.MAX_VALUE。

3.處理方法DEMO

import java.io.*;

{
    public static void main (String[] args) throws java.lang.Exception
    {
        String s="41500000"; 
        Float value = Float.intBitsToFloat(Integer.valueOf(s.trim(), 16)); 
        System.out.println(value); 

        Float f=13.0f; 
        System.out.println(Integer.toHexString(Float.floatToIntBits(f))); 
    }
}

輸出結果:13.0
輸出結果:41500000

4.方法介紹

Float方法對浮點數與比特的相互轉化

浮點數轉bit

Float.floatToIntBits(float f) 將一個浮點數轉成一個比特序列。返回一個32位整數,表示你作爲參數提供的浮點數的 IEEE 754 比特排列。

bit轉浮點數

Float.intBitsToFloat(int bits)將傳入整數作爲一個比特序列,按float對應位置規定意義,轉成一個浮點數。

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