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

#include<stdio.h>voidmain(){doublex=1,y=2,c;c=1.0+x/y;printf("%d\n",c);}... #include<stdio.h>
void main()
{
double x=1,y=2,c;
c=1.0+x/y;
printf("%d\n",c);
}
展开
 我来答
老冯文库
2011-03-26 · 知道合伙人软件行家
老冯文库
知道合伙人软件行家
采纳数:1139 获赞数:8733

向TA提问 私信TA
展开全部
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。
returnsr
2011-03-26 · TA获得超过296个赞
知道小有建树答主
回答量:271
采纳率:0%
帮助的人:161万
展开全部
#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类型)所以就丢失了精度,因此在计算过程中要避免把高精度的值转化为低精度的*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
呀咪娱乐播报
2011-03-26
知道答主
回答量:8
采纳率:0%
帮助的人:1万
展开全部
在上面的程序输入的时候,定义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位小数点)就会显示出小数点以后的结果,就是全部答案
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
余生随性co
2011-03-26
知道答主
回答量:16
采纳率:0%
帮助的人:11.1万
展开全部
因为双精度的数据的分配空间是8个字节,以补码的形式进行运算,而整型量的分配空间只有两个字节。在c被赋值double型的1.50000000,它在内存中的存储形式是64位,printf函数在输出整型格式的时候是截取前八位,忽略后面,最后输出为0;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
疯狂的小子啊
2011-03-26
知道答主
回答量:5
采纳率:0%
帮助的人:0
展开全部
x/y = 0 , 1.0+x/y = 1.0
再将1.0+x/y赋给c, c = 1.0
在printf函数中,格式%d需要int类型,但c的类型是double,在编译时会出现警告,结果为0
今后注意点就行了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
redfloyd
2011-03-27 · TA获得超过437个赞
知道小有建树答主
回答量:353
采纳率:0%
帮助的人:253万
展开全部
看到楼上的答案!我恍然大悟啊!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式