C语言 为什么浮点数据类型以不同的方式处理 X/Y(例如 5/9)和 X.0/Y.0(例如 5.0/9.0)?



我正在用C语言处理这段代码,无法理解为什么对这两个代码得到不同的答案。

第一个写入不带小数点的值

float num2=(5/9);

这给了我如下输出:

0.000000

带小数点

float num2=(5.0/9.0);

这给了我如下输出:

0.555556

这种答案差异背后的工作或理论是什么?

C 将 5 和 9 视为整数。所以它在整数级别进行操作,即 5/9 确实为零。比,此结果分配给 num2 变量。

当你写 5.0/9 时,C 看到 5.0 是一个浮点值,所以它会在浮点数中执行操作,这会给你一个不同的结果,现在这个结果将分配给你的 num2。

你也可以写这个

num2=(float)5/9; //or
num2=5/(float)9; //or
num2=5/9.0;

无论采用哪种方式,您都将一个操作数提升到浮点级别,因此整个操作将在浮点级别进行。

5 和 9 都是整数。所以,5/9的结果是0.一切都在整数级别完成,然后放入浮点num2变量中。为了获得实际的真实答案0.555556您需要至少有一个数字作为浮点数或实数。5.0/95/9.0或类型转换其中之一,(float)5/9也可以工作。

理论是,数字被转换/放大到更高的数据类型(忘记了正确的术语(。就像在5/9.0的情况下,这里的5首先转换为5.0然后完成除法操作。因此,C在执行右侧操作时不会查看指令的左侧。

C 从"自下而上"计算表达式。

在顶部,声明float num2=(5/9);包含表达式(5/9)。该表达式包含5/9。该表达式使用操作数59上的运算符/。这些操作数位于底部。

59是类型为int的文本。5/9使用int算术进行评估。结果是int值为零。然后计算括号,因此(5/9)有效地(0),因此它是零。然后将此零转换为float以用于初始化num2

由于表达式是自下而上计算的,因此它们会受到它们使用的操作数的影响。它们不受其所在上下文的影响。表达式最终将分配给float这一事实不会导致使用float对其进行计算。

相关内容

最新更新