![daf04faa68f201f215940e27f7771156.png](https://i-blog.csdnimg.cn/blog_migrate/c6b6c6a8c0d1302bb5dd6350f4d58884.jpeg)
小数如何存储
无论是单精度还是双精度在存储中都分为三个部分:
- 符号位(Sign) : 0代表正,1代表为负
- 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
- 尾数部分(Mantissa):尾数部分
其中float的存储方式如下图所示:
![1100a18ef55df6bf38287d0b8c54408b.gif](https://i-blog.csdnimg.cn/blog_migrate/292bd861aa620d8fc6c6812904fb874b.gif)
而双精度的存储方式为:
![e39d1b0af5b0bb696da012b643b2096b.gif](https://i-blog.csdnimg.cn/blog_migrate/4d2243187675580cd5e9aa5ed198a0e2.gif)
float和double类型的数据在内存中的保存形式是一样的,只是double表示的范围更大而已。因此,这里只介绍float的表示方法。double同理。
转换举例
举例:22.8125 转二进制的计算过程:
整数部分:除以2,商继续除以2,得到0为止,将余数逆序排列。
![1d67b75fec4fcad86bce74c896a26991.png](https://i-blog.csdnimg.cn/blog_migrate/5602c46187ebeaeea337550fc8e1bded.jpeg)
得到22的二进制是10110
小数部分:乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。
![cb37d7600e6a1842913de09ce5dda15d.png](https://i-blog.csdnimg.cn/blog_migrate/262e187e0f5cf39b9c69d0111b78e8c9.jpeg)
得到0.8125的二进制是0.1101
结果:十进制22.8125等于二进制00010110.1101
程序验证
假设,我现在有一个数据-12.25。那么这个数据在计算机内部是如何存储的呢?
首先,将这个浮点数转换成二进制数。经过转换,得到的二进制数为:1100.01。
接着,将这个二进制数用科学计数法来表示,1.10001 * 2 ^ 3。
由于这个数是负数。所以,符号位为1;指数位为127 + 3 = 130;尾数(小数)为10001。
然后,将指数130转换为二进制数10000010。
最后,由于float占4个字节,也就是32位,所以,-12.25在内存中表示为:
11000001010001000000000000000000,将这个数用十六进制表示为0xC1440000。
那么,我们的计算结果对不对呢?我们可以用程序来验证一下。
![e125dbeafbdd905af46fc398093e8be9.png](https://i-blog.csdnimg.cn/blog_migrate/11b7377c38ec232b2cc294b89735d280.jpeg)
完全正确
尾言
如果阁下没有学习位运算不妨关注小编的零基础视频教程:
《C语言51课视频教程合集》
《C语言十大新手练手项目实战》
《C语言数据结构那点事儿》
通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势,人人都可以学习的C语言课程