为什么C语言算出来是负数?大神们帮忙检查一下吧

#include <stdio.h>
void main()
{
int n,m,s;
n=2;
m=2;
s=2;
for(n=2;n<=16;n=n+2)
m=m*(n+1)*(n+2);
s=m+s;
printf("%d\n",s);
}

int 是有符号基本整型
for(n=2;n<=16;n=n+2)
m=m*(n+1)*(n+2);

你的m的初步估计是3的8次方4的8次方乘以2 144194

然后肯定是超出界限了。。
int是2个字节。。也就是16位,第一位是数据的正负0正1负,15位是数值最大的值是32767
超出了。。。然后你最后结果的反正是超出范围了。,。最终是哪里超出的就不一定是最后了。。。当你m还在循环的时候就超出了。。追问

我是要求2的阶层到16的阶层的累加。那应该怎么改?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-29
Int 类型为 4 个字节,在 -2147483648~2147483647 之间。

由于int类型在内存的存取方式,左边第一位表示符号位(1表示负数,0表示正数),故当取值超出4个字节即32位时
01111111 11111111 11111111 11111111 // 这是int类型所能表示的最大正整数
假设现在有个大正数超出了int取值范围
1111 | 11111111 11111111 11111111 11111111

↑ ↑
截断舍去 符号位0变成1,故为负数来自:求助得到的回答
第1个回答  2012-12-29
一般情况下,int都差不多是4个字节的,也就是说最大能放的数是2的32次方,当你要存放的数据大于这个结果时,系统就会将高位舍弃,也就是常说的数据溢出,而你的m要存放的是17的阶乘,已经远大于该数据了,因此出错也是难免的了!
希望可以帮到你,本人知道的不多,如果说法有误的话请指正!
第2个回答  2012-12-29
是因为s的值已经超出整数的表示范围了
for(n=2;n<=16;n=n+2)
m=m*(n+1)*(n+2);
s=m+s;
是想写成这样吗
for(n=2;n<=16;n=n+2)
{
m=m*(n+1)*(n+2);
s=m+s;
}
第3个回答  2012-12-29
已经超出了 int 能保存的范围
相似回答