2013-06-12 538 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)); 

,這將打印你(種)期待結果。

您應該總是明確地指定變量以匹配格式字符串,否則您可能會看到一些奇怪的值打印。