C printf使用%d和%f

use*_*514 10 c printing floating-point double printf

我正在研究这个程序,我注意到使用%f表示double,%d表示float,这给了我一些完全不同的东西.谁知道为什么会这样?

int main ()
{
 float a = 1F;
 double b = 1;

 printf("float =%d\ndouble= %f", a, b);
}
Run Code Online (Sandbox Code Playgroud)

这是输出

float = -1610612736
double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000
Run Code Online (Sandbox Code Playgroud)

Tro*_*nic 6

%d代表十进制,它需要一个类型的参数int(或一些较小的有符号整数类型,然后被提升)。浮点类型floatdouble两者都以相同的方式传递(提升为double)并且它们都使用%f. 在 C99 中,您也可以使用%lf来表示 的较大尺寸double,但这纯粹是装饰性的(注意,scanf没有发生提升,这实际上有所不同)。


Ear*_*rlz 5

由于变量参数的工作方式,C除了%dand 之外,不知道您实际传递的值的类型%f。当您传递变量参数时,您基本上是在做,(void*)&myvalue因为编译器和运行时的函数都无法确定变量的类型,除了格式化字符串中给出的以外。因此,即使有隐式转换可用,编译器也不知道需要它。

好吧,在大多数系统上,double是8个字节,而float是4个字节。因此,这两种类型不是二进制兼容的。这就像试图将字符串解释为双精度或其他不兼容类型一样。

  • 是的,但是并不是真正意义上的`float`和`double`之间的兼容性。实际上,“ float”类型的可变参数在传递之前总是提升为“ double”,这意味着“ float”类型在此处不涉及任何内容。传递给printf的两个值都具有double类型。在第一个内部被解释为一个“ int”(由于%d指定符)。int和double的不兼容是导致观察到的未定义行为的原因。 (3认同)