liyiqi 发表于 2020-5-5 20:32:23

结果的原因

#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
原因!

老八秘制 发表于 2020-5-5 20:35:11

数据溢出??
没怎么学过C

qiuyouzhi 发表于 2020-5-5 20:36:14

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;
}

liyiqi 发表于 2020-5-5 22:57:39

这个我也知道数据太小,溢出。但我们老师问我们为什么结果是这样

sunrise085 发表于 2020-5-6 10:02:13

原因有很多:%d溢出问题导致的数据损失,%f存储精度损失,%d转为%f是的转换精度损失,大数和小数相加的精度损失

18812345678存放到%d中得到的是1632476494,这是溢出导致的精度损失。18812345678转为16进制结果如下:4614D9D4E,因超过了32位,会被截断,剩下614D9D4E,结果就是1632476494

15687654321以%f存储,会有精度损失,有效位数只有8位,得到的结果是15687654400,前8位是精确的,后三位是不精确的。

a+b的时候是浮点数与整型数相加,会先将整型数转为浮点数,1632476494转为浮点数有精度损失,得到的是1632476544

还有两个浮点数阶码不一样,相加减的时候会先进行对阶,转为相同的阶码,再运算。这里也会有精度损失。

这就导致了最后的结果有很大的差异,我这里得到的是:1350634375

注意:红色标出的部分,在不同的电脑上结果会不一样,甚至每次运行可能都不一样。
页: [1]
查看完整版本: 结果的原因