C语言中printf函数中%f和%lf结果为什么一样

printf("%f%lf\n",333.33333,333.33333);为什么结果一样,不是一个是对应单精度float,一个是对应双精度double的么?说明“l”对... printf("%f %lf\n",333.33333,333.33333);为什么结果一样,不是一个是对应单精度float,一个是对应双精度double的么?说明“l”对“f”没有作用么?
要是变量定义成float是不是只能用%f,定义成double只能用%lf?
展开
 我来答
linnjing
2013-11-12 · TA获得超过2631个赞
知道大有可为答主
回答量:1230
采纳率:91%
帮助的人:498万
展开全部
[转]

printf格式串中的%f到底是float还是double?实验来证明!

最近在CSDN上看到一个网友写下了类似如下代码,想以小数格式输出一个整数:

int a = 0, b = 0;
printf("%f, %d", a, b);
可是运行结果并不尽如人意,%f字段输出了0,%d字段输出一个较大的数据。

因为我最近刚阅读了浮点数的内存表示方法,所以对上述代码做出解释如下:
%f为double类型,需要两个字节表示,所以,printf在遇到%f时即将a,b的两个整型数据都读了去,而到了需要输出%d的时候,只能读取b的下一个单元,自然不是所期望的数据了。

但是有朋友说%f是float类型,%lf才是double类型,具此我特意查阅了MSDN和Linux man手册,均没有发现此类描述,在linux man手册中,说明%lf为long double类型。
为了说明问题,我又做了几个实验:

实验一,检查%f需要读取几个字节

int a=0, b=0, c=5;
printf("%f,%d\n", a, b, c);
输出结果:
0,5
结论:%f读取8个字节,即两个整型大小

实验二,检查%lf需要读取几个字节

int a=0, b=0, c=5;
printf("%lf,%d\n", a, b, c);
输出结果:
0,5
结论:%lf也读取8个字节(也许和机器位宽有关,我是32位的机器)

实验三,检查printf读取float类型数据

float a=0.0f;
int b=5;
printf("%f,%d\n", a, b);
输出结果:
0.0,5
结论:float类型只占4个字节的数据,但前面实验一已经证明%f会读8个字节,即double类型的宽度,所以,编译器在将float类型参数入栈的时候,事先转换成了double类型。

实验四,再次证明实验三的结论

float a=0.0f;
int b=5;
printf("%d,%d,%d\n", a, b);
输出结果:
0,0,5
结论:a在入栈的时候,占了8个字节。

以上4步,我觉得可以证明%f是按double类型输出的了,另外,我也知道了float类型在作为参数进行传递的时候,编译器会先将它转换成double类型。
cdyzxy
推荐于2017-09-13 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.4万
采纳率:84%
帮助的人:3569万
展开全部
在执行这个printf语句时,系统知道需要将后面的两个参数压栈,
由于程序中的写法,默认是double型数据,
所以系统在压栈时,自动将第一个数据进行了强制数据类型转换,将double型数据转换成float型数据压栈了,printf才能正常运行。
如果你在参数中提供两个float型数据或两个double型数据,系统就不会进行这个强制转换而出错了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kongxian0527
推荐于2017-09-16 · TA获得超过6203个赞
知道小有建树答主
回答量:1749
采纳率:84%
帮助的人:154万
展开全部
%f读取8个字节,%lf也读取8个字节。因此一样。
%f 浮点数(包括float和double)
%lf为long double类型
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-11-11
展开全部
精度不同就是保留的小数位数不同啊。双精度保留的小数位数多。
追问
保留的位数不同,为什么%f和%lf的结果是一样的,按你说的应该是%f保留的位数少,%lf保留的位数多,但是结果是两者一样
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Holly_Worm
2013-11-11 · 超过10用户采纳过TA的回答
知道答主
回答量:38
采纳率:0%
帮助的人:22.5万
展开全部
printf可以用%f输出float和double两种类型;scanf必须使用%f输入float,%lf输入double。
更多追问追答
追问
这个我知道,那printf里面%f和%lf就没区别了么,为什么结果是一样的
追答
我所知也仅限于此了,和楼主一起等更准确的答案吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式