使用 %f 但得到“格式 %f 需要 double 类型”

问题描述 投票:0回答:1

除非我累了,否则我不会理解以下警告。我不确定编译器基于什么(它是 MPLAB X 6,使用 Microchip 的 XC16 作为 dsPIC33 微控制器)。

float test=5.5;
printf("%f\n", test);
warning: format '%f' expects type 'double', but argument 2 has type 'float'

通常

%f
代表 float,
%lf
代表 double,对吧?
%hf
不存在,那么我怎样才能让这个警告消失而不做
printf("%f\n", (double)test)

我的问题有点与为什么在`printf`中没有定义`float`的说明符?

c floating-point embedded printf
1个回答
0
投票

这是一个编译器错误。 MPLAB 编译器因 C 标准合规性极差而臭名昭著。在 Microchip 论坛上,有很多非常旧的帖子报告了同样的问题(example example)。

如评论中所述,

printf
是一个可变参数函数,传递给它的所有参数都受到所谓“默认参数升级”的影响,在这种情况下,这意味着传递的
float
always隐式提升为
double
当传递到
printf
时。

因此,由于这些强制的默认参数提升,无论您尝试什么,您都无法传递

float
。因此,C 标准甚至没有提及
float
,例如 C17 7.21.6.1 §8:

f,F

double
争论...


与您的问题无关,您已经在这里混合了

float
double
float test=5.5;
5.5
常量的类型为
double
-
5.5f
给出
float

由于 C 的各种微妙的隐式提升规则,您应该养成永远不要在同一表达式中混合

float
double
或整数操作数的习惯。

© www.soinside.com 2019 - 2024. All rights reserved.