【问题标题】:Why is an addition of a float and int results a float?为什么添加浮点数和 int 结果是浮点数?
【发布时间】:2019-07-08 23:58:17
【问题描述】:

我目前正在阅读“C 编程语言 - 第 2 版”。在第一章中,解释了浮点数与 int 的操作会产生 int。有这个程序:

#include <stdio.h>

int main()
{
    float fahr, celsius;
    int lower, upper, step;

    lower = 0;
    upper = 300;
    step = 20;

    fahr = lower;
    while (fahr <= upper)
    {
        celsius = (5.0/9.0) * (fahr-32.0);
        printf("%3.0f\t%6.1f\n", fahr, celsius);
        fahr = fahr + step;
    }
}

fahr = fahr + step 行执行时,fahr 不应该变成 int 吗?是否因为我被宣布为浮点数而保持浮点数?

【问题讨论】:

  • 我想你一定是看错了。当你结合 float 和 int 时,int 被转换为 float,而不是相反。
  • this question 可能是相关的。
  • C 中的变量不能改变类型。
  • OT: about: celsius = (5.0/9.0) * (fahr-32.0); 变量 (celsius, fahr) 的类型为 float,但文字 (5.0, 9.0, 32.0) 的类型为 double 更好的方法是声明通过将f 附加到每个文字的末尾,将文字作为float 类型,IE celsius = (5.0f/9.0f) * (fahr-32.0f);

标签: c clang


【解决方案1】:

是的,如果您将变量声明为浮点数,它不会在您的代码中更改。如果在 int 和 float 之间进行操作并放入 float 变量,则会得到 float 结果,反之亦然,如果将变量放入 int var 中,则会丢失数字的小数部分.

您不能在 C 中更改变量类型。

【讨论】:

  • 但是,在实际代码中,编译器会在执行实际计算时将int提升为float
【解决方案2】:

如果书上这么说,那就错了。就这么简单!

当您将整数添加到浮点数时,您会得到一个浮点数。此外,您将结果分配给浮点数,因此它不能是其他任何东西。对象不会改变类型。

【讨论】:

  • 我们能谈谈 C 中的“对象”吗?
  • @EconoMix 是的,与 C++ 相同。请参阅标准的第 3.14 节(C99 参考)。
  • @EconoMix 不过,这不是你想的那种对象。
  • @EconoMix:C 中的对象是一个存储区域,其内容可以表示值。例如,对于int xx 是可以保存int 值的四个字节存储的名称(假设int 的大小为四)。这四个字节是一个对象。
【解决方案3】:

由于您将fahr 声明为float,因此您分配给它的任何值都将转换为float

intfloat 之间的任何算术运算都将产生float 结果。这被指定为常规算术转换的一部分:

6.3.1.8 常用算术转换

1 许多期望算术类型操作数的运算符导致转换并产生结果 以类似的方式键入。目的是确定操作数的通用实数类型 和结果。对于指定的操作数,每个操作数都进行转换,不改变类型 域,到对应的实类型是公共实类型的类型。除非 另有明确说明,公共实类型也是对应的实类型 结果,其类型域是操作数的类型域(如果它们相同), 否则复杂。这种模式称为通常的算术转换

首先,如果任一操作数对应的实数类型为long double,则另一 操作数在不改变类型域的情况下被转换为对应的实际类型为long double的类型。

否则,如果任一操作数对应的实数类型为double,则另一 操作数在不改变类型域的情况下被转换为一个类型 对应的真实类型是double

否则,如果任一操作数对应的实数类型为float,则另一 操作数在不改变类型域的情况下被转换为一个类型 对应的真实类型是float62)

否则,对两个操作数都执行整数提升。然后 以下规则适用于提升的操作数:

如果两个操作数的类型相同,则无需进一步转换。

否则,如果两个操作数都具有有符号整数类型或都具有无符号 整数类型,具有较小整数转换等级类型的操作数是 转换为具有更高等级的操作数的类型。

否则,如果具有无符号整数类型的操作数的秩大于或 等于另一个操作数的类型的等级,然后操作数与 有符号整数类型转换为无符号操作数的类型 整数类型。

否则,如果带符号整数类型的操作数的类型可以表示 无符号整数类型的操作数类型的所有值,然后 将无符号整数类型的操作数转换为 带符号整数类型的操作数。

否则,两个操作数都转换为无符号整数类型 对应于带符号整数类型的操作数的类型。
62) 例如,添加 double _Complexfloat 只需要转换 float 操作数到 double(并产生 double _Complex 结果)。

C 2011 Online Draft

两个ints 之间的算术运算将产生int 结果。例如,1/2 产生04/3 产生17/3 产生2 等。如果将整数除法的结果分配给float 变量,它将存储为float,但您没有得到结果的小数部分。 IOW,给定代码,如

float fahr = 4 / 3;
printf( "%f\n", fahr );

您的输出将是1.0,而不是1.33333。如果你想要一个浮点结果,至少有一个操作数必须是浮点类型:

float fahr = 4 / 3.0f;
printf( "%f\n", fahr );

将输出1.33333

【讨论】:

    【解决方案4】:

    +1 用于阅读那本书。 C 在算术上选择最高分辨率,因此 float 在您的情况下获胜。

    【讨论】:

    • 32 位 float 的分辨率不高于 32 位 int
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2011-03-20
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多