gpt4 book ai didi

c - 为什么在 C 中 float 转换为 int 时会四舍五入?

转载 作者:行者123 更新时间:2023-11-30 18:18:33 24 4
gpt4 key购买 nike

在一次采访中,有人问我对以下代码有何看法:

#include <stdio.h>

int main()
{
float f = 10.7;
int a;
a = f;
printf ("%d\n", a);
}

我回答:

  • 当您在不进行强制转换的情况下将 float 更改为 int 时,编译器会发出警告。

  • int 将具有垃圾值,因为您没有使用强制转换。

然后,他们允许我在在线编译器上运行该程序。我不知所措。我的两个假设都是错误的。编译器没有发出任何警告,int 的值为 10。即使我将 float 更改为 10.9 或 10.3 等值,答案还是相同的。即使进行强制转换也没有改变结果。

有人可以告诉我为什么会发生这种情况以及在什么情况下结果会有所不同。

注意:在编译时,面试官告诉我不要添加 gcc 标志。

<小时/>

编辑:现在我明白了, float 不会四舍五入,答案将是10。但是有人可以解释我为什么这样设计吗?为什么任何 float 在转换为 int 时都会被四舍五入?有具体原因吗?

最佳答案

标准 6.3.1.4 是这么说的:

When a finite value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero). If the value of the integral part cannot be represented by the integer type, the behavior is undefined.

未定义的行为部分与整数的大小和符号有关。如果您选择的整数太小而无法包含结果,则会调用未定义的行为。

The int will have garbage value as you are not using a cast

在溢出的情况下,int可能有一个垃圾值,但是强制转换的存在与否与此无关。

编译器永远不需要显示“警告”,警告不是 C 标准指定的内容,它仅涉及诊断(即某种消息,称为错误或警告)。因此,您永远不能假设每个编译器都会发出任何类型的警告。

在这种隐式浮点到整数转换的情况下,编译器根本不需要显示任何形式的诊断。然而,好的编译器会。

对于 GCC,此类警告相当草率,您必须通过添加 -Wconversion-Wfloat-conversion 明确告诉它发出警告。这些是暗示的额外标志。

关于c - 为什么在 C 中 float 转换为 int 时会四舍五入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35008621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com