问题
首先来看问题代码,没什么好说的,就是让用户输入两个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位被丢弃的猜想。