关于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
望广大鱼油帮忙找找问题!
@小甲鱼 第一次发帖真不容易,改来改去改来改去~~~{:10_245:} 因为溢出了,所以你先将pow(2,i)赋给temp,temp加到sum上 和 直接sum += pow(2,i) 是不一样的,而且最终的结果肯定是一个意料之外的数.你可以在每次循环里输出temp和sum的值,观察它们值的变化. 本帖最后由 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); 即可 ba21 发表于 2017-6-26 10:59
溢出导至的:
一:
蟹蟹,我忽略了返回值的数据类型。
页:
[1]