浮点数家族包括float,double和long double类型。浮点数字面值在缺少情况下都是double类型,除非它后面跟一个L或者l表示它是一个long double类型的值,跟一个F或者f表示它是一个float类型。
对于IBM-PC而言,单精度浮点数是32位的,双精度浮点数是64位的。
一个浮点数a由两个数m和e来表示:a = m × b^e。m(尾数),如果m的第一位是非0整数,称作规格化的。在计算机中一个浮点数的表示结构如下:
1.含小树的浮点数表示为二进制
假设要转换的数位123.456f:
首先将整数部分转化为二进制:1111011
然后将小数部分转化为二进制,可以通过乘以2的方式得到,如果乘以2小于0,对应位为0,否则对应位为1
.456转化为二进制为:01110100101111001
所以,123.456的二进制表示为:1111011.01110100101111001,右移6位,得到 1.111011 01110100101111001*2^6
阶码为6,加上127得到131,二进制表示为10000101,那么总的二进制表示为:0 10000101 11101101110100101111001
符号位 0 |
阶码 10000101 |
位数 111011 01110100101111001 |
表示成十六进制是 42 F6 E9 79
2.将纯小数转化为二进制
对于纯小数转化为二进制来说,必须首先进行规格化,对于0.0456,我们可以表示为1.4592乘以以2为底的-5次方的幂,即1.4592 * ( 2-5 )。转化为这样形式后,再按照上面处理小数的方法处理,得到二进制表示
1. 01110101100011100010001
去掉第一个1,得到尾数
01110101100011100010001
阶码为:-5 + 127 = 122,二进制表示为
0 01111010 01110101100011100010001
最后转换成十六进制
11 C7 3A 3D
3.将纯整数表示为浮点数
假设要转换的数据时45678.0f
直接将整数部分转化为二进制表示:1011001001101110.0
然后将小数点向左移,一直移到离最高位只有1位,也就是 1.011001001101110,一共移动了16位,我们知道,左移位表示乘法,右移位表示除法。所以原数就等于这样:1.011001001101110 * ( 215 )。现在尾数和指数都出来了。因为最高位的1是根据标准加上去的,只是为了满足规格化的要求,这时候需要把这个1去掉。尾数的二进制就变成了:011001001101110。
最后在尾数的后面补0,一直到补够23位,就是:01100100110111000000000。
再回来看指数,根据前面的定义,P-127=15,那么P = 142,表示成二进制就是:10001110。
45678.0f这个数是正的,所以符号位是0,那么我们按照前面讲的格式把它拼起来,就是:0 10001110 0110 0100 1101 1100 0000 000
最后转换成十六进制:
47 32 6E 00