我编写的程序如下
/* Note:Your choice is C IDE */
#include "stdio.h"
main()
{
int sum,j,n,k;
sum=0;
j=1;
sum=sum+j;
for (k=1;k<=17;k++)
{
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
}
printf ("%d",sum);
}
认为逻辑上并没有错误,但是结果却是-31669 请问各位大虾 我错在那里了?~
10 个解决方案
#1
用tc的吧,改成vc吧,或者改成 long sum,j,n,k;
tc下int 16 bit,移16位就溢出了,
最高为是1时就成负数了,
tc下int 16 bit,移16位就溢出了,
最高为是1时就成负数了,
#2
for (k=1;k<=17;k++)
{//要加上 j=1;
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
}
改成 for (k=1;k<=16;k++)
{
sum+=1<<k;
}
{//要加上 j=1;
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
}
改成 for (k=1;k<=16;k++)
{
sum+=1<<k;
}
#3
貌似多加到了2^17。
#4
一般整型量都是16bit的
所以最多可以支持到-32768 到 32767
前面一位是符号位
很明显,你的数值已经溢出了,所以造成这种现象
具体说明可参见计算机组成原理。
所以最多可以支持到-32768 到 32767
前面一位是符号位
很明显,你的数值已经溢出了,所以造成这种现象
具体说明可参见计算机组成原理。
#5
溢出了
#6
题目 2的0次方+2的1次方+2的2次方+2的3次方+。。。。。+2的16次方
--------------------------------------------------------------------
出错的原因有三个
第一 楼主题目要求只需要算到2的16次方,那么在for (k=1;k<=17;k++)中 k只能为 k<=16
第二 每次内循环完了以后,j都应该还原为1 也就是在sum=sum+j;语句后还应该有语句j=1;
第三 这个题目最后得到的正确结果应该是 131071 16位编译器下int 型最大只能表示到32758所以无法正常输出。
这是可以得出正确结果的程序,看看吧
#include "stdio.h"
main()
{
double sum,j,n,k;
sum=0;
j=1;
sum=sum+j;
for (k=1;k<=16;k++)
{
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
j=1;
}
printf ("%lf\n",sum);
}
--------------------------------------------------------------------
出错的原因有三个
第一 楼主题目要求只需要算到2的16次方,那么在for (k=1;k<=17;k++)中 k只能为 k<=16
第二 每次内循环完了以后,j都应该还原为1 也就是在sum=sum+j;语句后还应该有语句j=1;
第三 这个题目最后得到的正确结果应该是 131071 16位编译器下int 型最大只能表示到32758所以无法正常输出。
这是可以得出正确结果的程序,看看吧
#include "stdio.h"
main()
{
double sum,j,n,k;
sum=0;
j=1;
sum=sum+j;
for (k=1;k<=16;k++)
{
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
j=1;
}
printf ("%lf\n",sum);
}
#7
纠正:16位下的int型所能表示的最大值是 32768
#8
楼上诸位都说得很清楚了,不过感觉
for (k=1;k<=17;k++)
{
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
}
这段完全可以改成
j=2;
for (k=1;k<=16;k++)
{
sum=sum+j;
j*=2
}
for (k=1;k<=17;k++)
{
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
}
这段完全可以改成
j=2;
for (k=1;k<=16;k++)
{
sum=sum+j;
j*=2
}
#9
少了分号,应该是
sum+=j;
J*=2;
sum+=j;
J*=2;
#10
czlyc006 说得是
楼主揭贴吧
楼主揭贴吧
#1
用tc的吧,改成vc吧,或者改成 long sum,j,n,k;
tc下int 16 bit,移16位就溢出了,
最高为是1时就成负数了,
tc下int 16 bit,移16位就溢出了,
最高为是1时就成负数了,
#2
for (k=1;k<=17;k++)
{//要加上 j=1;
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
}
改成 for (k=1;k<=16;k++)
{
sum+=1<<k;
}
{//要加上 j=1;
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
}
改成 for (k=1;k<=16;k++)
{
sum+=1<<k;
}
#3
貌似多加到了2^17。
#4
一般整型量都是16bit的
所以最多可以支持到-32768 到 32767
前面一位是符号位
很明显,你的数值已经溢出了,所以造成这种现象
具体说明可参见计算机组成原理。
所以最多可以支持到-32768 到 32767
前面一位是符号位
很明显,你的数值已经溢出了,所以造成这种现象
具体说明可参见计算机组成原理。
#5
溢出了
#6
题目 2的0次方+2的1次方+2的2次方+2的3次方+。。。。。+2的16次方
--------------------------------------------------------------------
出错的原因有三个
第一 楼主题目要求只需要算到2的16次方,那么在for (k=1;k<=17;k++)中 k只能为 k<=16
第二 每次内循环完了以后,j都应该还原为1 也就是在sum=sum+j;语句后还应该有语句j=1;
第三 这个题目最后得到的正确结果应该是 131071 16位编译器下int 型最大只能表示到32758所以无法正常输出。
这是可以得出正确结果的程序,看看吧
#include "stdio.h"
main()
{
double sum,j,n,k;
sum=0;
j=1;
sum=sum+j;
for (k=1;k<=16;k++)
{
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
j=1;
}
printf ("%lf\n",sum);
}
--------------------------------------------------------------------
出错的原因有三个
第一 楼主题目要求只需要算到2的16次方,那么在for (k=1;k<=17;k++)中 k只能为 k<=16
第二 每次内循环完了以后,j都应该还原为1 也就是在sum=sum+j;语句后还应该有语句j=1;
第三 这个题目最后得到的正确结果应该是 131071 16位编译器下int 型最大只能表示到32758所以无法正常输出。
这是可以得出正确结果的程序,看看吧
#include "stdio.h"
main()
{
double sum,j,n,k;
sum=0;
j=1;
sum=sum+j;
for (k=1;k<=16;k++)
{
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
j=1;
}
printf ("%lf\n",sum);
}
#7
纠正:16位下的int型所能表示的最大值是 32768
#8
楼上诸位都说得很清楚了,不过感觉
for (k=1;k<=17;k++)
{
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
}
这段完全可以改成
j=2;
for (k=1;k<=16;k++)
{
sum=sum+j;
j*=2
}
for (k=1;k<=17;k++)
{
for(n=1;n<=k;n++)
{
j=j*2;
}
sum=sum+j;
}
这段完全可以改成
j=2;
for (k=1;k<=16;k++)
{
sum=sum+j;
j*=2
}
#9
少了分号,应该是
sum+=j;
J*=2;
sum+=j;
J*=2;
#10
czlyc006 说得是
楼主揭贴吧
楼主揭贴吧