浮点数(float)与十六进制(hexadecimal)之间的转换
以32位单精度浮点数为例,按IEEE 754规范的定义,使用32个位元来存储单精度二进制小数。---------------------------------------------------------|1 |8|23 位长|---------...
以32位单精度浮点数为例,按IEEE 754规范的定义,使用32个位元来存储单精度二进制小数。
---------------------------------------------------------
| 1 | 8 | 23 位长 |
---------------------------------------------------------
| S | Exp | Fraction |
---------------------------------------------------------
| 31 | 30至23 | 22至0位编号 |
| | 偏正值+127 | (从右边开始为0) |
---------------------------------------------------------
其中,S为符号位(0为正,1为负),Exp为指数位,Fraction为有效数位。
指数部分即使用所谓的偏正值形式表示,实际值为表示值与一个固定值(32位的情况是127)的和。
单精度的指数部分是-126~+127加上127,指数值的大小从1~254(0和255是特殊值)。
浮点小数计算时,指数值减去偏正值将是实际的指数大小。
例子:将浮点数6.91转换为十六进制数。
1、将6.91转换成二进制形式,有效位长为31(8+23)
-> 整数:6(10进制) -- 110(2进制,实际位长为3)
-> 小数:0.91(10进制)-- 111010001111010111000(2进制,实际位长21(23-3+1))
小数转换为二进制的方法:小数部分乘以2,取整数部分依次从左往右放在小数点后,直至小数点后为0。
0.91 * 2 = 1.82 ... 1
0.82 * 2 = 1.64 ... 1
0.64 * 2 = 1.28 ... 1
0.28 * 2 = 0.56 ... 0
0.56 * 2 = 1.12 ... 1
0.12 * 2 = 0.24 ... 0
0.24 * 2 = 0.48 ... 0
0.48 * 2 = 0.96 ... 0
0.96 * 2 = 1.92 ... 1
0.92 * 2 = 1.84 ... 1
0.84 * 2 = 1.68 ... 1
0.68 * 2 = 1.36 ... 1
0.36 * 2 = 0.72 ... 0
0.72 * 2 = 1.44 ... 1
0.44 * 2 = 0.88 ... 0
0.88 * 2 = 1.76 ... 1
0.76 * 2 = 1.52 ... 1
0.52 * 2 = 1.04 ... 1
0.04 * 2 = 0.08 ... 0
0.08 * 2 = 0.16 ... 0
0.16 * 2 = 0.32 ... 0
至此,6.91的二进制为:110.111010001111010111000
2、将原始二进制值规范化:调整使其实数的第一位大于1小于2
6.91 = 1.10111010001111010111000*2^2
3、构造浮点数的二进制原型
S: 0
Exp: 2 + 127(10进制) = 129(10进制) = 10000001(2进制)
Fraction: 10111010001111010111000 (注意:小数点前面的1不要了)
4、重新组合并由二进制转换成十六进制
0 10000001 10111010001111010111000
= 0100 0000 1101 1101 0001 1110 1011 1000
= 4 0 D D 1 E B 8
即6.91的十六进制为0x40DD 1EB8
更多推荐
所有评论(0)