printf("1!+2!+....+20!=%ld\n",t);
%ld 是以双精度浮点型输出, 不知道你是否为你的笔误,输出的应该是 s 吧.
用断点调试可以看到: 在进行第14次运算的时候,s的值已经为负,说明s的值已经超越了long的最大值,
而你输出的是 t ,表面上看n=19时输出的是正值,好像是正确的,其实 t 的值在第17次运算时已经不正确了.
计算结果溢出了,20! = 2432902008176640000 ,超过了long能表示的最大值。
老师让你们计算20!,就是想让你们体验一下溢出的结果。
在累乘的过程中,如果乘到二进制最高位(符号位)为1的时候,就成了负数了。
#include
void main()
{
long t=1,s=0;
int n;
for(n=1;n<=20;n++)
{
t*=n;
printf("%d:\t%d\n",n,t);//其实数据早就溢出了
s+=t;
}
printf("1!+2!+....+20!=%ld\n",s);//怎么输出的是t
}
float类型的数据范围比long的大。。。
printf("1!+2!+....+20!=%ld\n",t);
把t换成s试试呢???