當我執行這個代碼,它返回我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解決方案。 –