gpt4 book ai didi

c - 为什么没有在 `float` 中定义 `printf` 的说明符?

转载 作者:太空狗 更新时间:2023-10-29 16:16:11 26 4
gpt4 key购买 nike

看起来可能是,有(至少在 C99 中)可以应用于 int 的长度修饰符:%hhd%hd , %ld and %lld 表示signed char, short, long code> 和 long long。甚至还有适用于 double 的长度修饰符:%Lf 表示 long double

问题是为什么他们省略了float?按照该模式,它可能是 %hf

最佳答案

因为在 C 可变参数函数调用中,任何 float 参数都被提升(即转换)为 double,所以 printf 得到一个 double 并将使用 va_arg(arglist, double) 将其放入其实现中。

过去(C89 和 K&R C)每个 float 参数都被转换为 double。当前标准省略了对具有显式原型(prototype)的固定元数函数的这种提升。它与 ABI 有关(详细信息在其中解释) & calling conventions的实现。实际上,float 值在作为参数传递时通常会加载到双浮点寄存器中,但细节可能有所不同。阅读 Linux x86-64 ABI specification举个例子。

此外,没有实际理由为 float 提供特定的格式控制字符串,因为您可以调整输出的宽度(例如使用 %8.5f)作为需要,并且 %hdscanf 中比在 printf

中更有用(几乎是必需的)

除此之外,我猜原因(省略 %hf 指定 float - 提升为 double in caller- in printf) 是历史性的:起初,C 是一种系统编程语言,而不是 HPC 语言(直到 1990 年代后期,Fortran 才成为 HPC 的首选语言)并且float 不是很重要;它曾经(现在仍然)被认为是short,一种降低内存消耗的方法。今天的 FPU 足够快(在台式机或服务器计算机上)以避免使用 float 除非作为使用更少内存的手段。您基本上应该相信每个 float 都在某处(可能是 FPU 或 CPU 中)转换为 double

实际上,您的问题可能被解释为:为什么 %hd 存在于 printf (它基本上没用,因为 printf 正在获取一个 int 当你传递给它一些 short 时;但是 scanf 需要它!)。我不知道为什么,但我想它可能比在系统编程中更有用。

您可以花时间游说下一个 ISO C 标准以使 %hfprintf 接受用于 float(提升为 double printf 调用中,例如 short-s 被提升为 int),当 double 值超出范围时具有未定义的行为绑定(bind)到 float-s,并且对称地 %hfscanf 接受为 float 指针。祝你好运。

关于c - 为什么没有在 `float` 中定义 `printf` 的说明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32517932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com