鱼C论坛

 找回密码
 立即注册
查看: 3114|回复: 3

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

[复制链接]
发表于 2021-6-16 11:51:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

#define NUMBER_PEEKG 25000

int main()
{
    int i;
    unsigned long long  power;
    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?
最佳答案
2021-6-16 17:01:46
total = total + pow(2, i);
改为
total = total + (unsigned long long)pow(2, i);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-16 17:01:46 | 显示全部楼层    本楼为最佳答案   
total = total + pow(2, i);
改为
total = total + (unsigned long long)pow(2, i);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-24 10:50:33 | 显示全部楼层

谢谢!
为何减小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公斤。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

数字太小,不影响高位
但是隐式转换本身就不是一个啥好东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 14:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表