2013-06-12 505 views
6

当我执行这个代码,它返回我1610612736如何将C中的整数与浮点数相乘?

void main(){ 
float a=3.3f; 
int b=2; 
printf("%d",a*b); 
} 

为什么,以及如何解决这一问题?

编辑:这不是整数,浮点数甚至一个问题,如果我更换INT B = 2:由浮动B = 2.0F它返回相同的愚蠢的结果

+0

这是一个整数和浮点的问题 - 请参阅我的答案。 –

+0

@Carl是对的。它可能不是乘法本身的float/int问题,但_definitely_在格式字符串中。 – paxdiablo

+0

函数'printf'是一个* varargs *方法,签名为'int printf(const char * format,...)'。这意味着它会在第一个参数后面使用任意参数,并且它不能在编译时检查它们,或者将它们转换为从格式字符串*中获取的所需类型。你的格式字符串表示'%d',它寻找一个'int'。表达式'a * b'是'float',它被转换为'double'。这些类型甚至没有相同的内存大小,所以临时的'double'会被物理地减半,并被当作int来处理。这不是一个Solomonic解决方案。 –

回答

11

float和相乘的结果intfloat。除此之外,当传递到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 
+2

哇,'%a'必须在运行中为“最在printf角色中无用的格式说明符“奖励:-) – paxdiablo

+8

太棒了!通过使用字符串,您可以准确地将(二进制)浮点数字100%传输,即使是不使用IEEE754的系统。它以完全毫不含糊的方式保留了所有精度位。用户可能不在乎看到它,虽然.... –

+0

真棒,作品谢谢! – Wicelo

2

或者,你也可以做

printf("%d\n", (int)(a*b)); 

,这将打印你(种)期待结果。

您应该总是明确地指定变量以匹配格式字符串,否则您可能会看到一些奇怪的值打印。