转换为int时浮点数为何在C下面舍入?

Ash*_*uja -1 c floating-point int casting type-conversion

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

#include <stdio.h>

int main()
{
    float f = 10.7;
    int a;
    a = f;
    printf ("%d\n", a);
}
Run Code Online (Sandbox Code Playgroud)

我回答了:

  • 当您将a更改floatint没有强制转换时,编译器将发出警告.

  • int由于您没有使用演员表,因此将具有垃圾值.

然后,他们允许我在在线编译器上运行程序.我不堪重负.我的假设都是错误的.编译器没有发出任何警告,并且int值为10.即使我改变了,float如10.9或10.3这样的值,答案也是一样的.即使放一个cast也没有改变结果.

有人能告诉我为什么会发生这种情况,结果会在什么情况下有所不同.

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


编辑:现在我已经明白,浮动没有四舍五入,答案将是10.但有人可以解释我为什么这样设计?转换为int时为什么浮动,在下面四舍五入?有具体原因吗?

Lun*_*din 9

这就是标准6.3.1.4所说的:

当实数浮动类型的有限值被转换为除_Bool之外的整数类型时,小数部分被丢弃(即,该值被截断为零).如果整数部分的值不能用整数类型表示,则行为是未定义的.

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

由于您没有使用强制转换,因此int将具有垃圾值

在溢出的情况下,int 可能具有垃圾值,但是存在或没有强制转换与它无关.

编译器永远不需要显示"警告",警告不是C标准指定的东西,它只提到诊断(即某种消息,称之为错误或警告).因此,您永远不能假装每个编译器都会发出任何类型的警告.

在这种隐式float-to-int转换的情况下,编译器根本不需要显示任何形式的诊断.但是,好的编译器会.

在海湾合作委员会的情况下,这种警告相当草率,你必须明确告诉它通过添加-Wconversion或发出警告-Wfloat-conversion.这些是暗示的额外标志.