matlab uin8转int8如何转换成负数_很多学C语言的人不知道的事儿,小数是如何存储的?二进制白学了...

cdf5333e0efec20bdcf1d30cec176a77.png

小数如何存储

无论是单精度还是双精度在存储中都分为三个部分:

  1. 符号位(Sign) : 0代表正,1代表为负
  2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
  3. 尾数部分(Mantissa):尾数部分

其中float的存储方式如下图所示:

883e5c6413a0df61036fe1d6afa6bc3d.gif

而双精度的存储方式为:

c1a132261e1f65670970dde792f5bff6.gif

float和double类型的数据在内存中的保存形式是一样的,只是double表示的范围更大而已。因此,这里只介绍float的表示方法。double同理。

转换举例

举例:22.8125 转二进制的计算过程:

整数部分:除以2,商继续除以2,得到0为止,将余数逆序排列。

27a5db050da63eb5927ca8c0efe26381.png

得到22的二进制是10110

小数部分:乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。

7b6d179593acc8b87322471e24c47c64.png

得到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。
那么,我们的计算结果对不对呢?我们可以用程序来验证一下。

3b0e65c0cc9edd43f33e8c569f730b1a.png

完全正确

尾言

如果阁下没有学习位运算不妨关注小编的零基础视频教程:

《C语言51课视频教程合集》

《C语言十大新手练手项目实战》

《C语言数据结构那点事儿》

通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势,人人都可以学习的C语言课程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值