这个C语言程序为什么会输出 0

#include<stdio.h>
void main()
{
double x=1,y=2,c;
c=1.0+x/y;
printf("%d\n",c);
}

c的值为1.5,如果对应%f输出,则输出1.5,对应%d输出,则按整型数输出。
但c是按浮点型存储的,即1.5 = 0.75 * 2,存储时,只存储尾码0.75(二进制为0.11)和阶码1(二进制为1)即可,占8个字节,按int型输出时,只取前4个字节。
double浮点数占8字节,64位,int数占4字节,32位。
double浮点数从高到低位分别存储符号位(1位)、指数部分(11位)和小数部分(52位)
1.5的浮点存储格式为:
0 000 0000 0001 011(后面49个0)
符号位(0表示正数) 指数部分(1) 小数部分(0.75)
按整型数输出时,取低32位(全0):
即输出0。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-26
#include<stdio.h>
void main()
{
double x=1,y=2,c;
c=1.0+x/y;
printf("%G\n",c); // printf("%lf\n",c); /*这两种都可以输出正确结果*/
}
/* 因为double的精度比int 高,在进行类型转化的时候(因为你用%d输出即int类型)所以就丢失了精度,因此在计算过程中要避免把高精度的值转化为低精度的*/
第2个回答  2011-03-26
在上面的程序输入的时候,定义double x=1,y=2时这是整型常量,在下面c=1.0+x/y时你输入的是一个实数(1.0),加上两个整型常数相除,这是程序定义的错误,把上面的x=1,y=2改成x=1.0,y=2.0(实数)就可以了,还有最下面的%d是输出的整数,只有小数点前的结果,改成%f(输出单双精度,隐含6位小数点)就会显示出小数点以后的结果,就是全部答案
第3个回答  2011-03-26
因为双精度的数据的分配空间是8个字节,以补码的形式进行运算,而整型量的分配空间只有两个字节。在c被赋值double型的1.50000000,它在内存中的存储形式是64位,printf函数在输出整型格式的时候是截取前八位,忽略后面,最后输出为0;
第4个回答  2011-03-26
x/y = 0 , 1.0+x/y = 1.0
再将1.0+x/y赋给c, c = 1.0
在printf函数中,格式%d需要int类型,但c的类型是double,在编译时会出现警告,结果为0
今后注意点就行了!
第5个回答  2011-03-27
看到楼上的答案!我恍然大悟啊!

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网