实战:浮点数的二进制表示

本文不会讲解浮点数的表示原理,阅读前请先补充前置知识,可以先读读这几篇文章:
https://zh.wikipedia.org/wiki/IEEE_754
http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html

下面分别以 -0.2 和 9.1 为例来推导浮点数的二进制表示,这里只讨论单精度,双精度的推导方式是类似的。

整数部分二进制表示

将一个整数转为二进制的方法比较简单:1. 该整数除以 2 得到商和余数,余数作为低位;2. 将商作为整数继续重复 1。

所以 9.1 的整数部分转换过程如下 (注意左边是低位,右边是高位):

小数部分二进制表示

将一个小数转为二进制的方法跟整数类似,只不过除法要换成乘法:1. 该整数乘以 2 得到积,如果大于等于 1,则二进制位为 1,否则为 0;2. 若积大于等于 1,则减去 1,新的数继续重复步骤 1,否则原来的积继续重复步骤1。

所以 -0.2 和 9.1 的小数部分分别表示如下 (左边是高位,右边是低位):

二进制科学计数法表示

-0.2:

.00110011001100110011001100 = 1.10011001100110011001100×2^(-3)

9.1:

1001.00011001100110011001100 = 1.00100011001100110011001×2^(3)

浮点数三要素

得到二进制的科学技术表示法后,浮点数的三要素就好计算了:

s f e
-0.2 1 10011001100110011001100 -3 + 127 = 124 = 01111100
9.1 0 00100011001100110011001 3 + 127 = 130 = 10000010

内存模型

最后,把三要素连在一起得到两个数在内存中的实际存储模型:

-0.2

9.1

最后附上几个在线获取二进制表示的小工具: