请帮助我理解以下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。
为什么在这种情况下不会发生?
答案 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
会自动提升为...
(类似于chars
和short 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平台)。