1. 程式人生 > >float(浮點數或實數)與Hexadecimal(十六進位制)之間的轉換

float(浮點數或實數)與Hexadecimal(十六進位制)之間的轉換

先看一下IEEE關於浮點數的定義:

IEEE 754規定了四種表示浮點數值的方式:單精確度(32位元)、雙精確度(64位元)、延伸單精確度(43位元以上,很少使用)與延伸雙精確度(79位元以上,通常以80位元實做)。只有32位元模式有強制要求,其他都是選擇性的。

32位單精度

單精度二進位制小數,使用32個位元儲存。

1 8 23 位長
S Exp Fraction
31 3023
偏正值 +127
220 位編號(從右邊開始為0)

S為符號位

Exp為指數位

Fraction為有效數位

指數部分即使用所謂的偏正值形式表示,實際值為表示值與一個固定值(32位的情況是127)的和。採用這種方式表示的目的是簡化比較。因為,指數的值可能為正也可能為負,如果採用補碼錶示的話,全體符號位S和Exp自身的符號位將導致不能簡單的進行大小比較。正因為如此,指數部分通常採用一個無符號的正數值儲存。單精度的指數部分是−126~+127加上127 ,指數值的大小從1~254(0和255是特殊值)。浮點小數計算時,指數值減去偏正值將是實際的指數大小。

例如有一個浮點數是6.91,如何將其轉換為十六進位制呢?

首先將6.91轉換為二進位制形式:

110.111010001111010111000

將其規範化:調整使其實數第一位大於1小於2

6.91 =  1.10111010001111010111000 * 2^2

基本原型出來了

S:0

EXP : 2+127(10進位制) =129(10進位制) = 10000001(2進位制)

Fraction : 10111010001111010111000 (注意:小數點前面的1不要了)

組合一下: 0  10000001  10111010001111010111000

            =  0100 0000 1101 1101 0001 1110 1011 1000

            =  4       0        D      D       1       E       B       8