为什么从float到double的隐式转换会在程序中返回一个无意义的数字?

时间:2015-10-02 17:19:58

标签: c casting integer double

我正在为C编程课程介绍实验室作业,我们正在学习演员。

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

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_gravity="center"
        android:padding="16dp"
       android:gravity="center">

        <ImageButton
            android:id="@+id/thumb_button_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:src="@mipmap/ic_launcher"
            android:scaleType="centerCrop"
            android:layout_gravity="center"
            android:background="@null"
            android:contentDescription="@string/description_image_1" />

    </LinearLayout>

我得到以下输出:

#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;
}

对于最后两个输出,执行的数学运算导致浮点值。由于它们存储的变量是double类型,因此从float到double的转换不应该影响值,是吗?但是当我打印出5 5.000000 6.000000 1074921472 1075249152 的值时,我会得到输出中显示的垃圾数字。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:4)

  

但是当我打印出d的值时,我得到了输出中显示的垃圾数字。

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

%d需要int(并以十进制格式打印)。

%f需要double

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