为什么在我的程序中从 float 隐式转换为 double return 是一个无意义的数字?

Why does implicit casting from float to double return a nonsense number in my program?

我正在做一项介绍 C 编程的实验作业class,我们正在学习转换。

作为练习的一部分,我必须编写这个程序并解释每个练习中发生的转换:

#include <stdio.h>

int main(void)
{
  int a = 2, b = 3;
  float f = 2.5;
  double d = -1.2;
  int int_result;
  float real_result;

  // exercise 1
  int_result = a * f;
  printf("%d\n", int_result);

  // exercise 2
  real_result = a * f;
  printf("%f\n", real_result);

  // exercise 3
  real_result = (float) a * b;
  printf("%f\n", real_result);

  // exercise 4
  d = a + b / a * f;
  printf("%d\n", d);

  // exercise 5
  d = f * b / a + a;
  printf("%d\n", d);

  return 0;
}

我得到以下输出:

5
5.000000
6.000000
1074921472
1075249152

对于最后两个输出,进行的数学运算产生浮点值。由于存储它们的变量是 double 类型,从 float 到 double 的转换不应该影响值,不是吗?但是当我打印出 d 的值时,我得到了输出中显示的垃圾数字。

有人可以解释一下吗?

But when I print out the value of d, I get garbage numbers as shown in the output.

您正在使用 %d 作为格式,而不是 %f%lf。当格式说明符和参数类型不匹配时,你会得到未定义的行为。

%d 接受一个 int(并以十进制格式打印)。

%f 需要 double.

%lf 是错误 (C89) 或等效于 %f(C99 起)。