当我执行这个代码,它返回我1610612736如何将C中的整数与浮点数相乘?
void main(){
float a=3.3f;
int b=2;
printf("%d",a*b);
}
为什么,以及如何解决这一问题?
编辑:这不是整数,浮点数甚至一个问题,如果我更换INT B = 2:由浮动B = 2.0F它返回相同的愚蠢的结果
当我执行这个代码,它返回我1610612736如何将C中的整数与浮点数相乘?
void main(){
float a=3.3f;
int b=2;
printf("%d",a*b);
}
为什么,以及如何解决这一问题?
编辑:这不是整数,浮点数甚至一个问题,如果我更换INT B = 2:由浮动B = 2.0F它返回相同的愚蠢的结果
的float
和相乘的结果int
是float
。除此之外,当传递到printf
时,它将被提升到double
。您需要%a
,%e
,%f
或%g
格式。 %d
格式用于打印int
类型。
编者按:main
的返回值应该是int
。这里有一个固定的程序:
#include <stdio.h>
int main(void)
{
float a = 3.3f;
int b = 2;
printf("%a\n", a * b);
printf("%e\n", a * b);
printf("%f\n", a * b);
printf("%g\n", a * b);
return 0;
}
,其输出:
$ ./example
0x1.a66666p+2
6.600000e+00
6.600000
6.6
或者,你也可以做
printf("%d\n", (int)(a*b));
,这将打印你(种)期待结果。
您应该总是明确地指定变量以匹配格式字符串,否则您可能会看到一些奇怪的值打印。
这是一个整数和浮点的问题 - 请参阅我的答案。 –
@Carl是对的。它可能不是乘法本身的float/int问题,但_definitely_在格式字符串中。 – paxdiablo
函数'printf'是一个* varargs *方法,签名为'int printf(const char * format,...)'。这意味着它会在第一个参数后面使用任意参数,并且它不能在编译时检查它们,或者将它们转换为从格式字符串*中获取的所需类型。你的格式字符串表示'%d',它寻找一个'int'。表达式'a * b'是'float',它被转换为'double'。这些类型甚至没有相同的内存大小,所以临时的'double'会被物理地减半,并被当作int来处理。这不是一个Solomonic解决方案。 –