float参数的转换

「已注销」 2019-07-25 06:31:36
如图中所说,float因为在printf中,会把float转换成double,所以没有专用的转换说明,那请问%f不是float在printf中的转换说明吗,难道是double类型的转换说明?那为什么要输入一个doble类型的浮点数时,scanf要用%lf,用%f进行运算就会产生奇怪的结果?
...全文
253 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
寻开心 2020-02-04
  • 打赏
  • 举报
回复
这是哪一本书上讲的? 很少见有对这个事情做解释的啊!

c语言当中,传递到函数里面的都是具体数值,而不是变量的本身, 参数是放到栈里面进行传递的
那么每个参数在栈里面的位置和大小就是个问题
函数可以根据参数的类型来计算参数的位置
现在的问题是,如果参数的类型和传递的类型大小不一样会如何

在固定参数的函数当中,编译器会检查他,发现这种情况会报错
但是不固定长参数怎么办,这就是个问题
楼主的那个图很好的解释了float(32bits)和double(64bits)都是统一按照double类型来入栈,这样就能解决这个问题

举个例子,大家可以在自己的编译器里面测试一下
char ch='A';
int n = 123;
printf("float:%f int:%d", c, n); // 编译器会这里给出警告,%f和c的不匹配,忽略它去执行看看会发生什么
c没有正确输出这个可以理解, 但是,但是,你会发现n也没有正确输出
不同的编译器也许执行结果不一样
可以理解, 因为格式指定了参数之间的位置关系, 入栈的格式不匹配,后续的参数定位出了问题

scanf里面这个问题不会明显,因为参数都是指针, 只是在对指针指向的地址放数据的时候,会因为格式不同而破坏数据
但是对scanf函数的参数之间不会有影响

这样的问题在不固定长度的函数参数里面应该都会有体现
apkipa1 2020-02-04
  • 打赏
  • 举报
回复
这是规定的,scanf 之流 和 printf 之流就是不一样的。如果你觉得记起来比较烦,可以像 4 楼那样记,因为现在的 C 语言也接受 printf 给 %lf (与 %f 完全等价)。
九十辰 2020-02-04
  • 打赏
  • 举报
回复
浮点数后面加话个f就可以了
lin5161678 2020-02-04
  • 打赏
  • 举报
回复
printf 中参数float 会转换为double入栈
这句话的意思的 float 和 double 都是入栈 8 字节
printf 解析格式控制字符%f 会从栈里面读取8个字节的数据 作为一个double输出
所以 printf 没有针对 float的格式控制符
%f是针对double的

而scanf情况不一样
%f 还是 %lf 对应的参数都是指针 都是读取4个字节的数据
但是后面的处理有区别
%f 对应float 会向指定的内存写入 4个字节的数据
%lf 对应 double 回向指定的内存写入 8个字节的数据
因为写入字节不同 所以 %f 和 %lf 不能混用

备注 类型大小不固定 这个回答中的类型大小仅供参考
Vector_PX 2019-07-26
  • 打赏
  • 举报
回复
小转大是可以的,大转小是不可以的
「已注销」 2019-07-26
  • 打赏
  • 举报
回复
引用 1 楼 自信男孩 的回复:
%f也是可以的,可以看一下C标准,double也用%f。
为何书中说float没有转换说明呢?难道不是%f?
nice_cxf 2019-07-26
  • 打赏
  • 举报
回复
float是f,double是lf.
自信男孩 2019-07-25
  • 打赏
  • 举报
回复
%f也是可以的,可以看一下C标准,double也用%f。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧