xife丶 发表于 2017-6-26 00:48:28

关于S1E6课后题“舍罕王的失算”

本帖最后由 xife丶 于 2017-6-26 13:01 编辑

本人自学编程有段时间了(其他语言),近期打算系统的跟着小甲鱼的C语言教程学习C语言,就在做到S1E6课后题时发现了一个奇怪的现象。

以下是两种正常代码:
for(i=0,sum=0;i<64,i++)
{
        temp = pow(2,i);
        sum += temp;
}//输出18446744073709551615

/*--------分割线--------*/

i = 64, sum = 0;
while(i--)
{
        temp = pow(2,i);
        sum += temp;
}//输出18446744073709551615
以下是两种异常代码:
for(i=0,sum=0;i<64,i++)
{
        sum += pow(2,i);
}//输出0

/*--------分割线-------*/

i = 64, sum = 0;
while(i--)
{
        sum += pow(2,i);
}//输出1023

望广大鱼油帮忙找找问题!
@小甲鱼

xife丶 发表于 2017-6-26 00:57:08

第一次发帖真不容易,改来改去改来改去~~~{:10_245:}

a110929 发表于 2017-6-26 08:09:18

因为溢出了,所以你先将pow(2,i)赋给temp,temp加到sum上 和 直接sum += pow(2,i) 是不一样的,而且最终的结果肯定是一个意料之外的数.你可以在每次循环里输出temp和sum的值,观察它们值的变化.

ba21 发表于 2017-6-26 10:59:30

本帖最后由 ba21 于 2017-6-26 11:01 编辑

溢出导至的:

一:
temp = pow(2,i); //先把pow(2,i)计算出来的结果转换成unsigned long long 赋值给 temp
sum += temp;
二:
sum += pow(2,i); //统一用浮点数计算,再赋值。 pow函数返回的是浮点数
                         //改成 sum += (unsigned long long)pow(2,i); 即可

xife丶 发表于 2017-6-26 13:02:58

ba21 发表于 2017-6-26 10:59
溢出导至的:

一:


蟹蟹,我忽略了返回值的数据类型。
页: [1]
查看完整版本: 关于S1E6课后题“舍罕王的失算”