int转float的坑

问题

首先来看问题代码,没什么好说的,就是让用户输入两个int类型的参数,然后做除法。由于结果可能是小数,所以用float接收计算的结果。
在这里插入图片描述
如果输入的两个数字太大,接近int的极限取值,就会出错,请看结果。
在这里插入图片描述
这里出错的原因就在于把int转为了float。



int和float的存储方式

float

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

int

在这里插入图片描述

int转float

int的最大取值2147483647,写成二进制就是这样
在这里插入图片描述
可以看成是:0111 1111 1111 1111.0,需要把小数点移动到最前面的1后面,像这样
在这里插入图片描述
小数点左移了30位,float的指数部分就是127+30=157,写成二进制 1001 1101。然后把小数部分放到float的尾数部分,但是这里小数部分有30位,而float只能装下23位的尾数,装不下的就会被丢弃,这也正是把int转float做除法结果出错的原因。

现在float里面的内容

在这里插入图片描述
这里可以很明显看出,int的最后7位被丢弃了。



测试和验证

我们可以写一个程序实际测试一下就知道了

测试程序的代码

在这里插入图片描述

输出结果

在这里插入图片描述
这个结果可能不是很清晰,但已经可以看出规律了,试试不输出相同的数字
注释掉这部分代码,再输出试试
在这里插入图片描述

调整后输出结果

在这里插入图片描述
这样规律就更明显了,这就验证了前面我们说的后7位被丢弃的猜想。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值