你知道浮点数和整形在内存中存储的差异吗

1:浮点数与整形在内存中的差异


我们都知道设一个int类型的整数变量n在内存中存储的是他的二进制补码(正数的原,反,补相同),负数在内存中存储的是反码加一。那么今天我们深度了解浮点数类型在内存中究竟是怎样存储的。

2:浮点数存在内存中的方式


就拿我们看到的这样一段代码来举例

 

我们说把一个整形的变量n的地址放在一个float类型的指针里面,然后打印出来,可能我们第一时间想到的就是第一个打印的值是9,第二个就是9.000000,第三个打印的是9,第四个打印的是9.000000。可是当我们打印得到的结果确实这样一个数字

 

可以看到第一个确实是9,最后一个也是9.000000,但中间两个数字却和预想的不一样。接下来就是我们要讲到的int类型和float类型的差异。

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V(数本身)可以表示成这样的形式

1:(-1)^S * M * 2^E

2:(-1)^S在内存中表示符号位,当S==0,V位正数,当S==1,V为负数

3:M表示有效数字位,大于等于1,小于2.

4:2^E表示指数为

怎么理解这段话呢。就是说一个数9.0在内存中存储的是1001.0,M表示有效数字在科学计数法中表示的就是1.0010,E表示的就是1001.0移动了三位表示的就是2^3,最后表达出来的形式就是(-1)^S * 1.0010 * 2^3,得到这个结果我们就可以确定出S==0,M==1.0010,E==3。

IEEE 765规定 对于32位的浮点数来说,最高位是符号位S,接着8位是指数E,剩下的23位有效位是M。如图

 

 那么我们可以得出E在内存是是一个(unsigend int),但是E有可能负数。我们拿0.5来计算。0.5的二进制形式是0.1,用科学计数法表达出来就是(-1)^S * 1.0 * 2^-1,我们此时就发现E是一个负数,但是科学计数法又规定,E是一个无符号数,就代表只能是一个正数。所以就又规定其实E在存入内存中的时候是会加上一个中间位的,在8个bit位的内存下(它的取值范围是0-255)会加上一个127,11个bit(0-2047)位下加上一个1023。M在存储的是小数位,我们发现存储M的时候他总是以1.xxxxxx来存储的,为了提高精度,前面的1就被舍弃掉了,取出来的时候又会被自动加上。这是我们E在存储时候的样子,那么接下来我们说E在取出的时候的样子有三种情况

1:E取出的时候不全为0也不全为1那么就是我们正常的计算。

2:当E取出全为0的时候:我们前面说到E在存入的时候会自动加上一个127,那么只有当E是一个-127的时候才会取出的时候全为0。那我们再去计算的话就是(-1)^S * 1.xxxx……(127)* 2^-127那我们算出来这个值得多大。这是一个无限接近大于或者小于0得数。所以我们就说当E取出全为0是那么指数E等于(1-127)&(1-1023)就是他的数有效数字M不在加上他的第一位而是还原为0.xxxx……的小数。这样做是为了表示+-0,以及无线接近0的小数

0.5即 0 00000000 011000000 00000000 0000000

当我们讲了这些之后来看float取出的值时是不是就知道时为什么了。我们就说int类型的n在内存中存储的补码时00000000 00000000 00000000 00001001 我可以看出E的指数是全0那么他就是一个无线接近0的数,所以我们最后得到的值就是0.000000。

后面又说9.0转换成整数的时候我们就可以先算出他的科学计数法

(-1)^0 * 1.0010 * 2^130 得到的二进制就是

0 10000010 00100000 00000000 0000000,站在int类型的角度这就是他的数我们可以算出来这个二进制的值就是1091567616,就和我门前面所算出的值是一样的了。

3:总结

通过验证我们发现浮点数和整形在内存中的存储是存在差异的,以便于当我们以后看到计算出一串不理解的数字后知道是为什么

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值