C printf使用%d和%f

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

int main () { float a = 1F; double b = 1; printf("float =%d\ndouble= %f", a, b); } 

这是输出

 float = -1610612736 double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000 

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

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

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

它与数据的内部表示有关。 您正在尝试打印一个浮动,就好像它是一个int,它具有完全不同的内部(二进制)表示。

双重案例类似。 你可能在float变量之后有垃圾(任何数据)。 该垃圾被解释为double值的一部分。

%d打印一个整数,因此printf将变量a解释为int。

使用gcc 3.4.6,我使用你的代码得到两个值的0(在初始化后取F,因为这会导致编译器错误)。 我怀疑这与被解释为int为0的变量的一部分有关,然后编译器变得混乱……(可能有更好的解释,但我想不到它)。

对两个变量使用%f为我打印两个变量1.000000。

您可以在此页面底部附近找到转换字符列表:

http://www.exforsys.com/tutorials/c-language/managing-input-and-output-operations-in-c.html