这个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);
} 展开
void main()
{
double x=1,y=2,c;
c=1.0+x/y;
printf("%d\n",c);
} 展开
8个回答
展开全部
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。
但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。
展开全部
#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类型)所以就丢失了精度,因此在计算过程中要避免把高精度的值转化为低精度的*/
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类型)所以就丢失了精度,因此在计算过程中要避免把高精度的值转化为低精度的*/
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在上面的程序输入的时候,定义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位小数点)就会显示出小数点以后的结果,就是全部答案
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为双精度的数据的分配空间是8个字节,以补码的形式进行运算,而整型量的分配空间只有两个字节。在c被赋值double型的1.50000000,它在内存中的存储形式是64位,printf函数在输出整型格式的时候是截取前八位,忽略后面,最后输出为0;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
x/y = 0 , 1.0+x/y = 1.0
再将1.0+x/y赋给c, c = 1.0
在printf函数中,格式%d需要int类型,但c的类型是double,在编译时会出现警告,结果为0
今后注意点就行了!
再将1.0+x/y赋给c, c = 1.0
在printf函数中,格式%d需要int类型,但c的类型是double,在编译时会出现警告,结果为0
今后注意点就行了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看到楼上的答案!我恍然大悟啊!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询