4

示例代码:

#include <stdio.h>
#define __STDC_WANT_IEC_60559_TYPES_EXT__
#include <float.h>

#ifdef FLT16_MAX
_Float16 f16;
int main(void)
{
    printf("%f\n", f16);
    return 0;
}
#endif

调用:

# gcc trunk on linux on x86_64
$ gcc t0.c -std=c11 -Wall

预期诊断:

<nothing>

实际诊断:

t0.c:9:14: warning: format '%f' expects argument of type 'double', but argument 2 has type '_Float16' [-Wformat=]
    9 |     printf("%f\n", f16);
      |             ~^     ~~~
      |              |     |
      |              |     _Float16
      |              double

这是否意味着在__STDC_WANT_IEC_60559_TYPES_EXT__AND 下如果FLT16_MAX定义了 gcc 不知道printf可以与 一起使用_Float16?它应该意识到吗?

另外:printf("%f\n", f);when fis afloat导致上面没有警告,尽管format '%f' expects argument of type 'double', but argument 2 has type 'float'. 使困惑。

4

1 回答 1

8

铿锵手册

因为默认参数提升仅适用于标准浮点类型,所以当作为可变参数或无类型参数传递时,_Float16值不会提升。double因此,在使用某些图书馆设施时必须小心_Float16;例如,没有printf格式说明符_Float16,并且(与 不同)它在传递给 时float不会被隐式提升,因此程序员必须在将其与或类似说明符一起使用之前将其显式转换为 double。doubleprintf%f

于 2022-01-11T20:28:45.413 回答