浮点数的存储规则

按照实数的存储方式,可以划分为定点实数存储和浮点实数存储。

定点实数存储:约定整数位和小数位的长度,比如用4字节存储实数,我们可以约定两个高字节存放整数部分,两个低字节存储小数部分。

这样做的缺点显而易见:存储不灵活,比如我们想存储65536.5,由于整数的表达范围超过了2字节,就无法用定点实数存储方式了。

浮点实数存储:用一部分二进制位存放小数点的位置信息,其他的数据位用来存储数据和符号。

IEEE浮点数标准

IEEE规定的浮点数会将一个浮点数转换为二进制数。以科学计数法划分,将浮点数拆分为3部分:符号(正负)、指数(小数点位置)、尾数(小数部分)

1.float类型的IEEE编码

float类型在内存中占4字节(32位)。第31位用于表示符号,23~30位表示指数,0~22位表示尾数。

浮点数的存储规则_第1张图片

例:将float类型的12.25转换为IEEE编码,12.25对应的二进制数为1100.01,用科学计数法表示为1.10001 x 2^3。 由于在二进制的情况下,最高位始终为1,为一个恒定值,故将其忽略不计。

12.24经IEEE转换后如下:

符号位:0

指数位:10000010 (十进制3+127=130)

由于指数可能为负,IEEE编码方式规定,当指数小于0111111 (127) 时为负数,反之为正数。所以指数的计算公式为 n+127

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

将转换后的符号位、指数位、尾数位按二进制拼接在一起,最终IEEE浮点编码为:01000001010001000000000000000000

例:将float类型 -0.125 转换为IEEE编码,-0.125 对应的二进制数为0.001,用科学计数法表示为1.0 x 2^-3。 由于在二进制的情况下,最高位始终为1,为一个恒定值,故将其忽略不计。

-0.125经IEEE转换后如下:

符号位:1

指数位:01111100(十进制-3+127=124)

由于指数可能为负,IEEE编码方式规定,当指数小于0111111 (127) 时为负数,反之为正数。所以指数的计算公式为 n+127

尾数位: 00000000000000000000000(当不足23位时,低位补0填充)

将转换后的符号位、指数位、尾数位按二进制拼接在一起,最终IEEE浮点编码为:10111110000000000000000000000000

2.double类型的IEEE编码

double类型在内存中占8字节(64位)。第63位用于表示符号,63~52位表示指数,0~51位表示尾数。

浮点数的存储规则_第2张图片

 

 


摘自《c++反汇编与逆向分析技术解密》

你可能感兴趣的:(c语言)