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

时间:2011-12-19 09:18:51

标签: c printf

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

#include<stdio.h>
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。

为什么在这种情况下不会发生?

3 个答案:

答案 0 :(得分:9)

您没有打印y,而是再次打印x

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

答案 1 :(得分:1)

  

据我所知,当我们将float分配给一个int变量时   变量的小数部分终止然后分配给   中间体

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

这会导致printf语句中出现问题,因为您正在使用int说明符%d打印一个没有强制转换的浮点变量。

修复你的代码如下:

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

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

答案 2 :(得分:1)

floats参数传递时,

doubles会自动提升为...(类似于charsshort ints提升为ints的方式) 。当printf()查看格式说明符(%d%f或其他)时,它会根据格式说明符(int)或者double来抓取并解释它收到的原始数据。 printf("%d\n",x)或其他什么)然后打印出来。

double错误,因为您将printf()传递给int,但却认为它将是printf()int让你为谎言买单。它的参数需要4个字节(很可能,但不一定是4个字节),这是double的大小,它从之前放置8个字节的位置抓取那些字节(再次,很可能,但不是ints 4.0必须有8个字节),其中4个字节恰好全为零,然后将它们解释为整数并打印出来。实际上,IEEE-754双精度格式的2的幂通常具有52个零位,或者超过6个8位字节为零。

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