结果的原因
#include<stdio.h>int main()
{
int a,c;
double b;
printf("请输入两个手济号:\n");
scanf("%d %f",&a,&b);
printf("两号之和为 %d ",a+b);
return 0;
}
输入18812345678 和15687654321
结果为1400897536
原因! 数据溢出??
没怎么学过C int范围太小了,改大一点就好:
#include<stdio.h>
int main()
{
long long int a,b,c;
printf("请输入两个手济号:\n");
scanf("%lld %lld",&a,&b);
c = a+b;
printf("两号之和为 %lld ",c);
return 0;
} 这个我也知道数据太小,溢出。但我们老师问我们为什么结果是这样 原因有很多:%d溢出问题导致的数据损失,%f存储精度损失,%d转为%f是的转换精度损失,大数和小数相加的精度损失
18812345678存放到%d中得到的是1632476494,这是溢出导致的精度损失。18812345678转为16进制结果如下:4614D9D4E,因超过了32位,会被截断,剩下614D9D4E,结果就是1632476494
15687654321以%f存储,会有精度损失,有效位数只有8位,得到的结果是15687654400,前8位是精确的,后三位是不精确的。
a+b的时候是浮点数与整型数相加,会先将整型数转为浮点数,1632476494转为浮点数有精度损失,得到的是1632476544
还有两个浮点数阶码不一样,相加减的时候会先进行对阶,转为相同的阶码,再运算。这里也会有精度损失。
这就导致了最后的结果有很大的差异,我这里得到的是:1350634375
注意:红色标出的部分,在不同的电脑上结果会不一样,甚至每次运行可能都不一样。
页:
[1]