基本数据类型的表现形式(浮点数)

来源:互联网 发布:绵阳长虹网络公司地址 编辑:程序博客网 时间:2024/04/19 02:11

浮点数类型

    c/c++中,使用浮点方式存储实数(所谓浮点方式是指,用一部分二进制位存放小数点位置信息,我们称之为指数域,其他数据位用来存储没有小数点时的数据和符号,我们称之为数据域,在访问时,取得指数域,与数据域运算后得到真值)

   c/c++里用两种数据类型保存浮点数,float(单精度),double(双精度)float4字节空间,double8字节空间,浮点数是有符号的,最高位用来表示正负。

 浮点数操作不会用到通用寄存器,二是使用浮点寄存器。

 float类型在内存中占4字节,最高位用来表示符号;在剩余的31位中,从左到右取8位用来表示指数,其余23用以表示尾数。

 在进行二进制转换前,需要对单精度浮点数进行科学计数法 转换,例如,将float类型的12.25f转换为IEEE编码,需将12.25转换为对应的二进制数1100.01,整数部分是1100,小数部分是01,在这里回忆下实数转换为二进制的方法,以22.8125为例:

整数和小数分别转换。
整数除以2,商继续除以2,得到0为止,将余数逆序排列。
22 / 2 11 0
11/2 5 余 1
5 /2 2 余 1
2 /2 1 余 0
1 /2 0 余 1
所以22的二进制是10110
小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。
0.8125x2=1.625 取整1,小数部分是0.625
0.625x2=1.25 取整1,小数部分是0.25
0.25x2=0.5 取整0,小数部分是0.5
0.5x2=1.0 取整1,小数部分是0,结束
所以0.8125的二进制是0.1101
十进制22.8125等于二进制10110.1101

 以此方式计算的12.25f的二进制数为1100.01,然后小数点向左移,每移动一次指数加1,移动到除符号位以外的最高位为1初,这里移动了3次,12.25变为1.10001,指数部分为3,由于以此方式转换后的最高位始终1(不是指符号位,而是1.0001的这个整数1),为一个恒定值,故将其忽略。

12.25IEEE转换后

l 符号位:0

l 指数位:十进制127+3,对应的二进制位10000010

l 尾数位:10001 000000000000000000(不足23位时,低位补0填充)

指数位之所以要加127,是因为指数可能出线负数,这样当指数位小于127时,指数是负数,反之为正数。

12.25转换后的IEEE编码按二进制拼接为

01000001010001 000000000000000000,十六进制为0X41440000,内存中以小尾方式排列,故为 00 00 44 41