printf中两个数字的除法return c中的垃圾值

Division of two numbers in printf return garbage value in c

printf("%d", (float) 9/ (float) 5);中输出什么?

Note: In printf function the format specifier is %d

输出似乎是 0 就像下面的代码 return answer 0.

float a = 9/5;
printf("%d",a);

但一点也不。正确的输出是 -1073741824 作为 垃圾值 这就是问题所在。为什么?

我们可以进行显式类型转换,将整数数据类型转换为浮点数据类型。

但为什么类型转换在此 printf("%d", (float) 9/ (float) 5); 代码中不起作用?

我知道这是一个愚蠢的问题,但我想知道这个愚蠢的问题。

printf() 除了您提供的“%d”格式说明符外,无法知道您传递的是什么类型。当它看到 "%d" 时,它将使用 va_arg() 从它收到的参数中提取一个整数。那里没有整数,所以任何事情都有可能发生。浮点值通常在与整数不同的寄存器中传递,所以这不像你只是将浮点数解释为 int,你实际上是从某个未知的地方加载一个 int。

(float)9 / (float)5(或更简单地说 9.0f / 5.0f)的值为 1.8f。而 9/5 的值是 1,并且当分配给浮点数时隐式转换为 1.0f(相当于 (float)(9/5))。

在这两种情况下,使用 %d 格式说明符解释任一值都具有未定义的行为,但结果不同并不奇怪,因为输入不同。也就是说,即使值是相同的,这也不应该令人惊讶 - 这是未定义行为的事情 - 所有赌注都关闭了。

考虑:

float a = 9.0f / 5.0f ;
printf( "%d\n", *(int*)(&a) ) ;

float b = 9 / 5 ;
printf( "%d\n", *(int*)(&b) ) ;

两者都显示 ab 的位模式,分别解释为 int。结果是确定性的,反映了传递的值 1.8f1.0fhexadecimal:

中的输出值
a = 3FE66666
b = 3F800000

分别对应https://www.h-schmidt.net/FloatConverter/IEEE754.html

处的1.8和1.0

Experimenting with variations 你的“未定义行为”代码,没有一致性 - 结果是 non-deterministic 并且与传递的值没有意义或对应。