兄弟们!帮忙看看我的程序错在那里了。。。简单的c语言计算

时间:2023-02-03 11:44:09
题目 2的0次方+2的1次方+2的2次方+2的3次方+。。。。。+2的16次方


我编写的程序如下

/* 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时就成负数了,

#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;
}


#3


貌似多加到了2^17。

#4


一般整型量都是16bit的
所以最多可以支持到-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);


}

#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
}

#9


少了分号,应该是
sum+=j;
J*=2;

#10


czlyc006  说得是


楼主揭贴吧 

#1


用tc的吧,改成vc吧,或者改成   long sum,j,n,k;

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;
}


#3


貌似多加到了2^17。

#4


一般整型量都是16bit的
所以最多可以支持到-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);


}

#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
}

#9


少了分号,应该是
sum+=j;
J*=2;

#10


czlyc006  说得是


楼主揭贴吧