为什么在`printf`中定义`float`不是一个说明符?

前端之家收集整理的这篇文章主要介绍了为什么在`printf`中定义`float`不是一个说明符?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
看起来它可能是,有(至少在C99)长度修饰符可以应用于int:%hhd,%hd,%ld和%lld平均带符号的char,短,长和长。甚至有一个长度修饰符适用于double:%Lf表示长双。

问题是他们为什么省略浮动?按照模式,它可能是%hf。

解决方法

因为在C变量函数调用中,任何float参数被提升(即转换)为double,所以printf得到了一个double,并且将使用va_arg(arglist,double)来获取它的实现。

在过去(C89和K& R C)中,每个float参数被转换为double。当前标准省略了对具有明确原型的固定功能的这种推广。它与ABI& C的相关(详细解释) calling conventions的实施。实际上,当作为参数传递时,浮点值通常被加载到双浮点寄存器中,但是细节可以变化。以Linux x86-64 ABI specification为例。

此外,没有什么实际的理由给一个特定的格式控制字符串为float,因为你可以调整输出的宽度(例如使用%8.5f)的需要,和%hd在scanf比更有用(几乎必要) printf

除此之外,我想原因(省略%hf指定float -promoted在调用者printf中double)是历史的:首先,C是一个系统编程语言,而不是一个HPC(Fortran在HPC中可能直到20世纪90年代末)和浮动不是很重要;它是(仍然是)被认为像短,一种方式来降低内存消耗。而且今天的FPU足够快(在台式机或服务器计算机上),以避免使用浮动,除非使用较少的内存。你基本上应该相信每个浮点都在某处(也许在FPU或cpu内)转换为双精度。

实际上,你的问题可能改写为:为什么%hd存在printf(其中它基本上是无用的,因为printf是一个int,当你传递一些短;但scanf需要它!我不知道为什么,但我想象比在系统编程它可能更有用。

你可以花时间游说下一个ISO C标准,以获得%hf通过printf的float(在printf调用时提升为double,如short-s被提升为int),当双精度值超出范围时, float-s和scanf对于浮点指针接受的对称%hf。祝你好运。

猜你在找的CSS相关文章