本文不会讲解浮点数的表示原理,阅读前请先补充前置知识,能够先读读这几篇文章: zh.wikipedia.org/wiki/IEEE_7… www.ruanyifeng.com/blog/2010/0…html
下面分别以 -0.2 和 9.1 为例来推导浮点数的二进制表示,这里只讨论单精度,双精度的推导方式是相似的。vue
将一个整数转为二进制的方法比较简单:1. 该整数除以 2 获得商和余数,余数做为低位;2. 将商做为整数继续重复 1。web
因此 9.1 的整数部分转换过程以下:工具
将余数从右往左收集起来就获得了 9.1 的整数部分的二进制表示方法:1001cdn
将一个小数转为二进制的方法跟整数相似,只不过除法要换成乘法:1. 该整数乘以 2 获得积,若是大于等于 1,则二进制位为 1,不然为 0;2. 若积大于等于 1,则减去 1,新的数继续重复步骤 1,不然原来的积继续重复步骤1。htm
因此 -0.2 和 9.1 的小数部分分别表示以下 (左边是高位,右边是低位):blog
-0.2:ip
.00110011001100110011001100 = 1.10011001100110011001100×2^(-3)内存
9.1:get
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
最后附上几个在线获取二进制表示的小工具: