浮点数的存储

浮点数家族包括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

原文地址:https://www.cnblogs.com/sanshuiyijing/p/3028077.html