C 为什么printf隐式浮点到int的转换不起作用?
请帮助我理解以下C输出:C 为什么printf隐式浮点到int的转换不起作用?,c,printf,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; } 据我所知,当我们将float赋值给int变量时,变量的小数部分被终止,然后赋值给int 为什么在这种情况下不会发生这种情况?您没有打印y,而是再次打印x 作为旁注,pri
#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;
}
据我所知,当我们将float赋值给int变量时,变量的小数部分被终止,然后赋值给int
为什么在这种情况下不会发生这种情况?您没有打印
y
,而是再次打印x
作为旁注,
printf
无法进行转换。因此,当需要%d
时传递一个浮点值是未定义的行为。您没有打印y
,而是再次打印x
作为旁注,printf
无法进行转换。因此,当需要%d
时传递浮点是未定义的行为
据我所知,当我们将float赋值给int变量时
变量的小数部分终止,然后分配给
内部的
语句是正确的,但要进行此转换,您必须转换希望转换的变量,而不仅仅是将其分配给另一个int变量
这也会导致printf
语句中出现问题,因为您使用int说明符%d
打印浮点变量时没有强制转换
修复如下代码:
printf("%d\n", (int) x);
^
| this is the cast operation
它将正确打印变量x
的整数值4
据我所知,当我们将float赋值给int变量时
变量的小数部分终止,然后分配给
内部的
语句是正确的,但要进行此转换,您必须转换希望转换的变量,而不仅仅是将其分配给另一个int变量
这也会导致printf
语句中出现问题,因为您使用int说明符%d
打印浮点变量时没有强制转换
修复如下代码:
printf("%d\n", (int) x);
^
| this is the cast operation
它将正确打印变量
x
的整数值4
当作为参数传递时,浮点值将自动提升为双倍值(与字符
和短整数
提升为整数的方式类似)。当printf()
查看格式说明符(%d
或%f
或任何内容)时,它根据格式说明符(如int
或double
或任何内容)获取并解释它接收到的原始数据,然后打印它
printf(“%d\n”,x)
是错误的,因为您正在将一个double
传递给printf()printf()
让你为谎言付出代价。它从参数中获取4个字节(很可能,但不一定是4个字节),即int
的大小,它从先前放置double
4.0的8个字节(同样,很可能,但不一定是8个字节)的位置获取这些字节,其中的4个字节恰好都是零,然后它将它们解释为一个整数并打印出来。事实上,IEEE-754双精度格式中的2次幂通常有52个零位,或超过6个8位的零字节
这些“最有可能,但不一定”的词意味着C标准并不要求类型有一个固定的大小和范围,它们可能因编译器而异,因操作系统而异。最近的4个字节<代码> int <代码> > 8字节>代码>双倍< /代码>是最常见的(如果我们考虑的话,例如x86平台)。. 当printf()
查看格式说明符(%d
或%f
或任何内容)时,它根据格式说明符(如int
或double
或任何内容)获取并解释它接收到的原始数据,然后打印它
printf(“%d\n”,x)
是错误的,因为您正在将一个double
传递给printf()printf()
让你为谎言付出代价。它从参数中获取4个字节(很可能,但不一定是4个字节),即int
的大小,它从先前放置double
4.0的8个字节(同样,很可能,但不一定是8个字节)的位置获取这些字节,其中的4个字节恰好都是零,然后它将它们解释为一个整数并打印出来。事实上,IEEE-754双精度格式中的2次幂通常有52个零位,或超过6个8位的零字节
这些“最有可能,但不一定”的词意味着C标准并不要求类型有一个固定的大小和范围,它们可能因编译器而异,因操作系统而异。最近的4个字节<代码> int <代码>和8字节>代码>双倍是最常见的(如果我们考虑,例如x86平台).< /p>是否意味着在最后一个打印语句中输出<代码> x <代码>?不是y
.thnx所有的…我问了一个愚蠢的问题…还有代码中的一个错误…我想在最后一个语句中打印y可能的重复您想在最后一个打印语句中输出x
吗?最后一个printf
再次打印x
,不是y
.thnx所有的…我问了一个愚蠢的问题…还有代码中的一个错误…我想在最后一个语句中打印y可能的重复项你能告诉我强制转换和转换的区别吗?你能告诉我强制转换和转换的区别吗?