C语言之数据在内存中的存储(浮点型篇)

目录

一.前言

二.正文

(1)案例引入

(2)文化输入

(3)解决疑惑

三.结尾


一.前言

在上一篇博文介绍了整型在内存中的存储方式,今天将为大家介绍浮点型数据在内存中的存储。浮点型就是我们数学中常说的小数,它之所以叫浮点型,是因为在科学计数法的表示方法下,它可以根据10的次数的改变来让小数点的位置“浮动”,这样理解就比较直观了。

另外,浮点数在内存中的存储是和整型有着较大区别的,所以在打印相关数据时占位符一定不要选错!!!

二.正文

(1)案例引入

让我们看一个很典型的程序

这是一个简单的程序,里面有着一个浮点型的指针通过强制类型转化来指向一个整型数据。先分别打印整型变量和浮点型指针所指向的数据;接下来将指针所指向的数据赋为浮点型之后,再分别打印整型变量和指针所指向的数据。

这里需要注意,整型变量对应的占位符是%d,指针变量对应的是%f。

其结果也是十分出人意料的

n的值和第二个*pFloat的值都是能想出来的,但是第二个和第三个就开始逐渐变得离谱了。。。

(2)文化输入

要搞懂这个问题,我们首先得搞清楚浮点数的存储规则

浮点数存储规则:

   根据国际规定,任意一个二进制浮点数可以表示为

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

   其中(-1)^s表示符号位-->S=0,为正;S=1,为负。

   M表示有效数字(1<=M<=2)

   2^E表示指数位

eg.

          -5.5(十进制)----->-101.1(二进制)---->1.011 * 2^2(S=1, E=2, M=1.011)

规定:

   对于32位浮点数(float),最高的1位是S,接着8位为指数E,其余23位为M

   对于64位浮点数(double),最高的1位是S, 接着11位为指数位,其余23位为M

特殊规定:

   前面说 1 <= M <= 2,也就是说M应该表示成 1.XXXXXX的形式,其中XXXXXX表示小数部分

   IEEE754规定,在计算机内部保存M时,默认这个数第一位总是1,因此可以被舍去,只保存后       面的XXXXXX部分(eg. 保存1.01时,只保存01,等到读取的时候再把第一位的1加上去)

=>这样做的目的是为了节省1位有效数字,使结果更加精确。

对于指数E的规定,情况就较为复杂

   首先,E位无符号整数(unsigned int)

   意味着如果E为8位,则它的取值范围为0~255

   如果E为11位,则它的取值范围为0~2047

!!!但是!!!我们知道科学计数法中E是会出现负数

所以,IEEE754规定:

   存入内存E的真实值必须加上一个中间数

   对于8位的E(float),这个中间数就为127

   对于11位的E(double),这个中间数就为1023

          eg.2^10 ==>E=10==>保存的时候32位浮点数的E必须保存10+127 = 137,即10001001 

然后,指数E从内存中取出还可分为三种情况:

   a. E不全为0或者是不全为1

           这时指数E计算值减127(float)/ 1023(double),得到真实值,再将M前加上第一位1

               eg.0.5(十进制)==>0.1(二进制),由于规定整数部分必须为1,则小数点右移一位

               ==>1.0 * 2^(-1)  E的真实值为-1,加上中间值127之后为126,二进制表示01111110

               ==>M部分去掉整数位的1,补齐23位的0

               ==>即00111111000000000000000000000000

b.E全为0

          这时E-127(E-1023)为真实值

          此时有效数字不再加上第一位的1(因为实在太小了),而是还原为0.XXXXXX的小数,这样为了表示正负0以及接近0的很小的数

c.E全为1

          这时如果有效数字M全为0,就表示正负无穷(正负取决于符号位)

好了,这波知识的强行灌入铁铁们接住了吗?

(3)解决疑惑

回到例题,这下我想大家应该就很通透了

就是这么一回事。

三.结尾

浮点数和整型在内存中的存储方式基本上就是这样的了,总之学习计算机不仅要广度,深度是更为重要的,掌握计算机的内功也可以让你在以后的职场招聘游刃有余,所以要持续关注我的博客,我会不断更新的,望大家监督和支持(谢谢点赞加关注)。我们下一篇见~

  • 43
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值