浮点数在内存中的储存

4 篇文章 0 订阅
2 篇文章 0 订阅

1 引入

整数在计算机内存储存以二进制储存很容易理解,那浮点数怎么储存的呢?
其实之所以想到要一探究竟是因为类似下面这段代码:

#include <stdio.h>
int main(void){
	int num = 5.75;
	printf("%d",num);
	return 0;
}

由于大意,用转义字符%d来打印浮点数,结果显示
在这里插入图片描述

为什么是-461808600呢?我也很奇怪,然后就开始研究研究吧。

当然这个也和编译器有关,有些就会强制类型转换,打印:5。

2 小数二进制十进制转换

在写如何储存之前不得插上一段二进制和十进制的互换(小数位):
:十进制的 0.125 化为二进制是多少呢?

方法:将小数部分不断乘以2,每次取整数部分直到为1.

0.125×2=0.25 取0
0.25×2=0.5 取0
0.5×2=1 取1
即0.125(10)=0.001(2)

二进制转十进制呢?
方法:将二进制各位乘以2的负次方,相加即可,

0×1/2+0×1/4+1×1/8=0.125

3 浮点数储存

现在我们来看浮点数如何储存,按照IEEE 754标准进行存储,具体如下:
在这里插入图片描述
第一段 占 1bit,表示符号位。代称为 S(sign)。
第二段 占 8bits,表示指数位。代称为 E(Exponent)。
第三段 占 23bits,表示尾数位。代称为 M(Mantissa)。

S: 符号位 0代表正数 1代表负数

E: 指数位 ,对于任何数来说 都可以满足
在这里插入图片描述
比如:对于 5 来说,因为 4 < 5 < 8,所以 n=2,而 n=E−127 所以E就等于129

M: 尾数位 也就是小数位,尾数xxxx后面补零

这里以5.75为例
将十进制转换成二进制,并转换位科学计数法表示:

5.75=101.11=1.0111×2^2

符号位:0(代表为正数)
指数部分为:2+127 = 129
尾数部分为:0111

所以:
指数位:129 = 1000 0001
尾数位:0111 0000 0000 0000 0000 000

完整二进制表示如下:

0 1000 0001 0111 0000 0000 0000 0000 000

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值