【问题标题】:Floating point conversion in ANSI CANSI C 中的浮点转换
【发布时间】:2023-03-02 21:08:01
【问题描述】:

鉴于以下 ANSI C 代码,我想知道结果:

main() {
  int a = 19.4 / 9.7;               // result = 2
  float b = (int) 19.4 / (int) 9.7  // result = 2.000000, why?
  float c = (int) 9.7;              // result = 9
}

我知道 C 会在转换为 int 时去掉所有小数位,但如果我看到第二行,我的逻辑就有缺陷。如果小数位被删除,结果必须是 2.11111。

在 ANSI C 中如何进行浮点转换?

【问题讨论】:

    标签: c floating-point type-conversion ansi


    【解决方案1】:

    在标准 C 中,除非另有说明(例如 19.4F、9.7F),否则 19.4 和 9.7 等文字被假定为双精度值。

    编译器将使用整数除法函数来计算 x / y(如果 x 和 y 都是 int(兼容)类型)或浮点除法函数来计算 x / y 如果 x 和 y 中的至少一个是浮点类型。

    float b = (int) 19.4 / (int) 9.7 // 结果 = 2.000000,为什么?

    您要求将 19.4 转换为 int,并将 9.7 转换为 int,实际上要求编译器计算 19/9 = 2 的整数除法,然后将其提升为浮点数以存储在 b 中。 2 变成 2.0。

    .PMCD.

    【讨论】:

    • 转换为 int 会截断浮点数,而不是舍入它。所以它应该是 19/9,而不是 20/10。
    【解决方案2】:

    在第 2 行中,您将输入值转换为整数,然后进行整数除法(因为除法的两个操作数都是整数,除法是在整数空间中完成的 - 这意味着任何小数结果都将被截断)。

    所以,19 / 9 = 2

    然后,为了将此整数转换为浮点数,它会将 2 隐式转换回 2.000000

    【讨论】:

      【解决方案3】:

      不,它必须是 2。当你将一个 int 除以一个 int 时,你得到一个 int。因此 2. 你可以在之后把它转换成你喜欢的任何东西,但是小数已经消失了。

      【讨论】:

        【解决方案4】:

        将两个整数相除,你将得到一个整数。除以一个浮点数和一个整数,你将得到一个浮点数。

        【讨论】:

          【解决方案5】:

          (int) 19.4 / (int) 9.7 等价于 19 / 9,它首先被解析为 2(一个 int)。只有在计算完2之后,才会被变量类型转化为float。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-03-14
            • 2011-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多