为什么printf隐式浮点到int转换不起作用?

请帮助我理解以下C输出:

#include int main() { float x = 4.0; printf("%f\n",x); printf("%d\n",x); int y=x; printf("%d\n",y); return 0; } 

输出gcc编译器

 4.000000 0 4 

据我所知,当我们将float赋给int变量时,变量的小数部分终止然后分配给int。

为什么在这种情况下没有发生?

你没有打印y ,你再次打印x

作为旁注, printf无法进行转换 。 因此,当期望%d时传递浮点数是未定义的行为。

当我们将float赋给int变量时,我已经读过,变量的小数部分被终止,然后被赋值给int。

语句是正确的,但要进行此转换,您必须转换要转换的变量,而不是仅将其分配给另一个int变量。

这会导致printf语句出现问题,因为您使用int说明符%d打印浮点变量而不使用强制转换。

修复你的代码是这样的:

 printf("%d\n", (int) x); ^ | this is the cast operation 

它将正确打印变量x整数值4

当作为...参数传递时, floats自动提升为doubles (类似于将charsshort ints提升为ints )。 当printf()查看格式说明符( %d%f或其他)时,它会根据格式说明符(如intdouble或其他)抓取并解释它接收的原始数据,然后将其打印出来。

printf("%d\n",x)是错误的,因为你正在向printf()传递一个double ,但是它会使它成为一个intprintf()让你为谎言买单。 它从参数中获取4个字节(最可能但不一定是4个字节),这是int的大小,它从之前放置8个字节的位置抓取那些字节(再次,最有可能,但不一定是8个字节) double 4.0的,其中4个字节碰巧都是零,然后它将它们解释为一个整数并打印出来。 实际上,IEEE-754双精度格式中的2的幂通常具有52个零比特,或者多于6个8比特的零字节。

那些“最有可能但不一定”的词语意味着C标准没有规定类型的固定大小和范围,它们可能因编译器而异,从OS到OS。 目前,4字节ints和8字节doubles是最常见的(如果我们考虑,例如x86平台)。