#include<stdio.h> int main() { printf("%lf\n%d\n",8/5,8/5); return 0; } 输出是 0.000000 2147319808
但是把第一个8/5改成8.0/5.0输出就是1.6000001为什么1、用lf从输出8/5结果是0.0000002、前面的8/5影响到了后边8/5的输出结果用codebl...
但是把第一个8/5改成8.0/5.0
输出就是1.600000
1
为什么
1、用lf从输出8/5结果是0.000000
2、前面的8/5影响到了后边8/5的输出结果
用codeblocks编的 展开
输出就是1.600000
1
为什么
1、用lf从输出8/5结果是0.000000
2、前面的8/5影响到了后边8/5的输出结果
用codeblocks编的 展开
展开全部
我略知一二,和你一起探讨。
首先,8/5和1是等价的,因为两个int数相除,结果也是int数。
其次,printf函数是从左往右读取参数的,然后将先读取的放到栈底,最后读取的放在栈顶,处理时则是从栈顶开始,所以我们看见的显示结果是,其实是从右边开始处理的。
最后,%lf以双精度型输出,要求输入为一个64位数。
你的程序相当于
#include<stdio.h>
int main(){
printf("%lf\n%d\n",1,1);
// 8/5就是1。
//从左往右取参数,先取%lf,64位数;再取%d,32位数。
//1是int,只有32位,所以光%lf就把两个1都取走了。%d取的是内存中后续的32位,不可预测。
//如果你把打印语句换成printf("%lf\n%d\n",1,1,3);你会发现,3正常输出了,说明%lf确实可能把两个1都取走。
//两个int型的1在内存中表示为0x0000000100000001,而按照双精度浮点型数的规则来解释这个数,就是0.
//浮点型的1.0和整型的1在内存里的表示方式是完全不同的,建议你google之。
//而8.0/5.0情况就完全不同了,商应该是一个64位的双精度浮点型数,与%lf匹配,这样第二个8/5就能顺利被%d取走。
return 0;
}
希望帮到你。
首先,8/5和1是等价的,因为两个int数相除,结果也是int数。
其次,printf函数是从左往右读取参数的,然后将先读取的放到栈底,最后读取的放在栈顶,处理时则是从栈顶开始,所以我们看见的显示结果是,其实是从右边开始处理的。
最后,%lf以双精度型输出,要求输入为一个64位数。
你的程序相当于
#include<stdio.h>
int main(){
printf("%lf\n%d\n",1,1);
// 8/5就是1。
//从左往右取参数,先取%lf,64位数;再取%d,32位数。
//1是int,只有32位,所以光%lf就把两个1都取走了。%d取的是内存中后续的32位,不可预测。
//如果你把打印语句换成printf("%lf\n%d\n",1,1,3);你会发现,3正常输出了,说明%lf确实可能把两个1都取走。
//两个int型的1在内存中表示为0x0000000100000001,而按照双精度浮点型数的规则来解释这个数,就是0.
//浮点型的1.0和整型的1在内存里的表示方式是完全不同的,建议你google之。
//而8.0/5.0情况就完全不同了,商应该是一个64位的双精度浮点型数,与%lf匹配,这样第二个8/5就能顺利被%d取走。
return 0;
}
希望帮到你。
2011-07-19
展开全部
因为实数就是保留小数点后六位有效数字
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-07-19
展开全部
1.%lf是浮点型输出,%d是int型输出,你用%lf去输出int型结果当然不行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
8, 5 是int
8.0, 5.0 是 float
int/int => int
float / float => float
printf("%f\n%d\n",0.8/0.5,8/5); 这样的吧?
printf("%lf\n%d\n",float(8)/float(5),8/5); //试试看这个
8.0, 5.0 是 float
int/int => int
float / float => float
printf("%f\n%d\n",0.8/0.5,8/5); 这样的吧?
printf("%lf\n%d\n",float(8)/float(5),8/5); //试试看这个
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询