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更改float为int没有强制转换时,编译器将发出警告.
int由于您没有使用演员表,因此将具有垃圾值.
然后,他们允许我在在线编译器上运行程序.我不堪重负.我的假设都是错误的.编译器没有发出任何警告,并且int值为10.即使我改变了,float如10.9或10.3这样的值,答案也是一样的.即使放一个cast也没有改变结果.
有人能告诉我为什么会发生这种情况,结果会在什么情况下有所不同.
注意:在编译时,面试官告诉我不要添加gcc标记.
编辑:现在我已经明白,浮动没有四舍五入,答案将是10.但有人可以解释我为什么这样设计?转换为int时为什么浮动,在下面四舍五入?有具体原因吗?
这就是标准6.3.1.4所说的:
当实数浮动类型的有限值被转换为除_Bool之外的整数类型时,小数部分被丢弃(即,该值被截断为零).如果整数部分的值不能用整数类型表示,则行为是未定义的.
未定义的行为部分是关于整数的大小和符号.如果选择的整数太小而无法包含结果,则会调用未定义的行为.
由于您没有使用强制转换,因此int将具有垃圾值
在溢出的情况下,int 可能具有垃圾值,但是存在或没有强制转换与它无关.
编译器永远不需要显示"警告",警告不是C标准指定的东西,它只提到诊断(即某种消息,称之为错误或警告).因此,您永远不能假装每个编译器都会发出任何类型的警告.
在这种隐式float-to-int转换的情况下,编译器根本不需要显示任何形式的诊断.但是,好的编译器会.
在海湾合作委员会的情况下,这种警告相当草率,你必须明确告诉它通过添加-Wconversion或发出警告-Wfloat-conversion.这些是暗示的额外标志.