梦梦q 发表于 2021-6-16 11:51:07

C语言S1E6_1题舍罕王的失算,两种加法结果不一致

#include <stdio.h>
#include <math.h>

#define NUMBER_PEEKG 25000

int main()
{
    int i;
    unsigned long longpower;
    unsigned long long sum;
    unsigned long long   weight;
    unsigned long long total;
    int sz = 0;
    i = 0;
    power = 0;
    sum = 0;
    total = 0;
    sz = sizeof(sum);
    printf("sizeof(i)=%d\n",sz);
    for(i=0;i<64;i++)
    {
      power = pow(2,i);
      sum = sum + power;

      total = total + pow(2,i);
       //printf("一共%llu颗麦子。\n",sum);
    }

    weight = sum /NUMBER_PEEKG;
    printf("一共%llu颗麦子。\n",sum);
    printf("一共%llu颗麦子。\n",total);
    printf("共重%llu公斤。\n",weight);

    return 0;
}

输出结果:
sizeof(i)=8
一共18446744073709551615颗麦子。
一共0颗麦子。
共重737869762948382公斤。

问题:
求麦子总和两种加法,结果不一样?是pow()函数的返回值类型是double吗?double + unsigned 溢出?结果为何是0?

yuxijian2020 发表于 2021-6-16 17:01:46

total = total + pow(2, i);
改为
total = total + (unsigned long long)pow(2, i);

梦梦q 发表于 2021-6-24 10:50:33

yuxijian2020 发表于 2021-6-16 17:01
改为

谢谢!
为何减小i的取值范围,输出结果在没有类型转换时也是一致的呢?
代码:
for(i=0;i<10;i++)
    {
      power = pow(2,i);
      sum = sum + power;

      total = total + pow(2,i);
       //printf("一共%llu颗麦子。\n",sum);
    }
结果:
sizeof(i)=8
一共1023颗麦子。
一共1023颗麦子。
共重0公斤。

yuxijian2020 发表于 2021-6-25 14:07:04

梦梦q 发表于 2021-6-24 10:50
谢谢!
为何减小i的取值范围,输出结果在没有类型转换时也是一致的呢?
代码:


数字太小,不影响高位
但是隐式转换本身就不是一个啥好东西
页: [1]
查看完整版本: C语言S1E6_1题舍罕王的失算,两种加法结果不一致