float(浮點數或實數)與Hexadecimal(十六進位制)之間的轉換
先看一下IEEE關於浮點數的定義:
IEEE 754規定了四種表示浮點數值的方式:單精確度(32位元)、雙精確度(64位元)、延伸單精確度(43位元以上,很少使用)與延伸雙精確度(79位元以上,通常以80位元實做)。只有32位元模式有強制要求,其他都是選擇性的。
32位單精度
單精度二進位制小數,使用32個位元儲存。
1 | 8 | 23 位長 |
S | Exp | Fraction |
31 | 30至23 偏正值 +127 |
22至0 位編號(從右邊開始為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