鱼C论坛

 找回密码
 立即注册
查看: 1675|回复: 4

[已解决]关于S1E6课后题“舍罕王的失算”

[复制链接]
发表于 2017-6-26 00:48:28 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 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

望广大鱼油帮忙找找问题!
@小甲鱼
最佳答案
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); 即可

执行输出

执行输出
CentOS 64-2017-06-26-00-49-58.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-26 00:57:08 | 显示全部楼层
第一次发帖真不容易,改来改去改来改去~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-26 08:09:18 | 显示全部楼层
因为溢出了,所以你先将pow(2,i)赋给temp,temp加到sum上 和 直接sum += pow(2,i) 是不一样的,而且最终的结果肯定是一个意料之外的数.你可以在每次循环里输出temp和sum的值,观察它们值的变化.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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); 即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-26 13:02:58 | 显示全部楼层
ba21 发表于 2017-6-26 10:59
溢出导至的:

一:

蟹蟹,我忽略了返回值的数据类型。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-29 09:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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