关于c语言的计算问题

来源:百度知道 编辑:UC知道 时间:2024/05/17 01:39:53
main()
{
long x;
x=32767*32767;
printf("%ld\n",x);
}
输出结果为1(错误)
main()
{
long x;
x=pow(32767;,2);
printf("%ld\n",x);
}
输出结果为1073676289(正确),为什么?
为什么x=32767*32767会溢出?我用的TC,而且TC里long是4个字节

这涉及C的细节,我建议你记住:程序中的常量其实也存放在内存单元中,C规定运算运算符两旁同类时运算结果与参与运算的数的类型相同,事实上时:加法器直接处理那两个内存单元中的数据,并将结果送到另一内存单元,而这里的“另一内存单元也是两字节长,因此他只接收到结果的低二字节部分(及1的补码)所以,以后的赋值运算也无济于事!

而对于一般用户完全可以这样记:
32767被默认为int,根据C语言规定,运算结果与参与运算的数的类型相同(运算符两旁同类时)。所以结果被默认为int型,自然就溢出了,
只要在常数后加后缀就能强制转换,当然也可一用强制类型转换(long)

pow()的原型时

double pow(double x,double n)所以你调用时系统就已经转换了

我用 vs 2005,结果没问题

TC里面的int是16位的?

也许是TC把整型常量当作int计算, 这样 32767 * 32767作为两个int相乘的结果就溢出了,虽然之后赋值给long也没意义了

你可以试试 x = 32767L * 32767L;

谁说会溢出
楼上的是谁 long最大是32767 你搞错没 C中int最大32767

long型的最大值就是32767,你32767*32767当然会溢出,建议maxlongint