浮点数在计算机中存储方式

今天在研究C语言程序的时候发现了一个问题,double在C语言中占8个字节,当定义一个double变量例如:

double d=120.5;
printf("%lf",d);

输出结果为:120.500000
但是当我以字节为单位(即定义一个字符型的指针p,令p=&d;)循环访问内存中的值时,得出来的结果令人匪夷所思
这里写图片描述
这是我从变量的起始地址循环访问所得到的结果,这个结果与我们的120.5有什么关系呢?
从网上查找到的一篇博文上看到了解释,但是因为那篇博文细节上有一点小错误,虽然经过多方转载但是并没有把这个错误改正过来,所以我才打算写这篇文章纠正一下。
无论是单精度还是双精度,在计算机中的表示方法都是类似的,因为计算机只识别0和1这两个数字,所以计算机采用二进制的科学记数法来表示小数,120.5的二进制是1111000.1,科学计数法表示为1.1110001x26
计算机把小数存储分为三部分:
1. 符号位(Sign) : 0代表正,1代表为负
2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
3. 尾数部分(Mantissa):尾数部分
这里写图片描述
再看我们120.5的存储方式,符号位为0表示正数,指数位因为双精度的指数位占11位,所以指数位的值为:6+(210-1)=1029,尾数部分为1110001后边补0,结果如下:
0 100 0000 0101 1110 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
所以计算机的输出结果为:40 5e 20 00 00 00 00 00
我们顺便看一下单精度的输出结果,单精度和双精度只是指数部分的值不同,尾数部分的长度不同,单精度的指数位占8位,所以它的指数部分的值就是6+(27-1)=133,所以单精度的存储方式如下:
0 100 0010 1111 0001 0000 0000 0000 0000
好了,希望通过这篇文章让你在面对float或者double类型奇怪的输出时不那么害怕。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值