一个十进制的数字,转换成二进制格式,动手计算下数字是怎样以二进制方式存储的。
参 考文档:
图片授权基于 www.pixabay.com 相关协议
首先要把二进制表贴出来,以便下面转换的时候查看:
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
2^10 | 2^9 | 2^8 | 2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
我们说一下「double float」双精度浮点数,基于 IEEE 754:
双精度浮点数为 64 位,单精度为 32 位,双精度比单精度,肯定表示的更加精准嘛,就是数字的位数能表示的更多。双精度浮点数存储的格式由三部分构成:- 符号位(Sign):1位
- 指数位(Exponent):11位
- 精度位(Fraction):52位
数字:300
我们拿数字 300 举例:300/2 = 150 余 0;150/2 = 75 余 0;
75/2 = 37 余 1;
37/2 = 18 余 1;
18/2 = 9 余 0;
9/2 = 4 余 1;
4/2 = 2 余 0;
2/2 = 1 余 0;
1/2 = 0 余 1;余数反推回去 100101100 补全以后就是 00100101100,这样的操作可以在「纸」上操作。如果在电脑上,可以使用 (300).toString(2)。 最终数字 300 转换成二进制为 100101100,计算精度位的时候,第一个 1 去掉,对应的就是精度的存储值就是 00101100;计算指数位的时候需要先写成 1.00101100E8 ,小数点向前移动了 8 位,指数为 8 ;看最上面的对应表,指数为 8 的话,对应的为 00000001000,这个二进制数据需要加上「基准值」,最后结果为 1023 + 8 = 1031;而 1031 对应的二进制码为 10000000111,所以哈,指数位存的码点值为 10000000111。数字:10.24
另一个数字 10.24 举例:10/2 = 5 余 0;
5/2 = 2 余 1;
2/2 = 1 余 0;
1/2 = 0 余 1;
余数反推 1010,补全以后就是 00000001010;小数部分计算:.24 * 2 = .48 取 0;
.48 * 2 = .96 取 0;
.96 * 2 = 1.92 取 1;
.92 * 2 = 1.84 取 1;
.84 * 2 = 1.68 取 1;
.68 * 2 = 1.36 取 1;
.36 * 2 = .72 取 0;
.72 * 2 = 1.44 取 1;
.44 * 2 = .88 取 0;
......小数部分在尾数的表示为 001111010....那这个 10.24 在二进制表示应该是 1010.001111010.... 这样的数值。精度位:010001111010(把上面的 1 去掉)指数位:先转成 1.010E3,然后指数为 3 就是 00000000011 + 01111111111 = 100000000010,也可以计算为 3 + 1023 = 1026在线转换页面:
http://www.binaryconvert.com/result_double.html?decimal=053 参 考文档:
https://blog.csdn.net/abcdu1/article/details/75095781
https://blog.csdn.net/zhengyanan815/article/details/78550073
https://www.boatsky.com/blog/26
图片授权基于 www.pixabay.com 相关协议
推荐阅读
如何用 vue-cli 调试源码?如何调试 Vue 源码?Vue 在挂载数据前都经历了什么?