零基础C语言学习

             *c语言学习笔记(十九)*

数据存储(二)

一、浮点型的存储
浮点数家族包括:float、double,long double型
这里介绍一个头文件,可以查看数据类型的大小
<limits.h>
整型和浮点型在内存中的存储方式是不同的:

int i = 9;
float* pa = (float*)&i;
printf("%d \n", i);
printf("%lf ", *pa);       

对于上面一段代码,在定义了一个整型数时,当用浮点型打印下来,发现结果就发生了改变在这里插入图片描述
同时,当我们以整型格式打印浮点型时,得到的结果也是完全不同的。下面察看一下国际对于浮点数的表示形式定义:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
国际规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被省略掉,只保存小数点后面的部分,等到取出结果时,再加上1,这样做的目的是节省一位存储位,用来存放更多小数。
至于指数E,首先规定了E是无符号数,所以为了解决E为负数的情况,规定存储过程中加上一个中间数字,例如八位数的E,他的中间数就是127,假设E=-1,那么存储时E=-1+127=126。
以一个小数5.5 为例,分析一下内存的存储方式:
5.5 首先将他改写成二进制形式 小数点前面为5,二进制序列为0101,小数点后面0.5,也就是2的负一次方
所以结果为:101.1 然后将二级制改写成国际标准存储形式
符号位为正 S=0 M=1.011 E=2
存储在32位机器中的结果就是:
0 10000001(2+127=129) 01100000…
由于计算机中为16进制表现形式,将以上二进制改写为16进制
0x40 b0 00 00在这里插入图片描述
由于小端对齐,调试程序发现确实如此,这也解释了文章开头为什么1整型浮点型打印不同的原因。
在指数E取出的情况里面,分为三种:
(1)E不全为0或者1
这时将E减去中间数,得到真实值,再将有效数字M前加上1(之前说过1是在存储时省略的)
(2)E为全0
这种情况非常少见,若存储全0,假设是八位的E,那么E的真实值为-127,这个数是很小的。可以表示0或者非常接近0的数
(3)全为1
若M等于0,则表示正负无穷大
注:我们发现浮点型的数值存储,一定是有误差的,其中一点就是在转换为标准形式的过程中,小数点前移,这个时候就会产生误差。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值