2011-12-19 80 views
1

請幫我理解下面的C輸出:爲什麼printf隱式float到int轉換不起作用?

#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; 
} 

輸出繼電器上gcc編譯

4.000000 
0 
4 

至於我讀的時候我們分配浮到變量int變量的小數部分被終止,然後分配給int。

爲什麼它不是在這種情況下發生?

+0

您的意思是在最後的打印語句中輸出'x'? – Howard 2011-12-19 09:20:57

+0

最後'printf'再次打印'x',而不是'y'。 – 2011-12-19 09:21:58

+0

thnx所有...我已經問了一個愚蠢的問題...和代碼中的錯誤....我打算在最後的聲明中打印y – 2011-12-19 09:25:08

回答

9

你不打印y,你再次打印x

作爲一個附註,printf不能做轉換。所以當期望%d時傳遞一個浮點數是未定義的行爲。

1

只要當我們分配浮子爲int變量該變量的 小數部分我已讀被終止,然後分配給 INT。

說法是正確的,但是進行這種轉換必須cast變量,你要轉換,而不是僅僅把它分配給另一個int變量。

這會導致問題也在printf聲明,因爲要打印的INT符%d浮點型變量不進行強制轉換。

修復你這樣的代碼:

printf("%d\n", (int) x); 
       ^
       | this is the cast operation 

,它會正確打印整數值4變量x。當作爲...參數傳遞(類似於如何charsshort ints都提升到ints

1

floats自動升級到doubles。當printf()查看格式說明符(%d%f或其他)時,它會根據格式說明符(如intdouble或其他)抓取並解釋它接收到的原始數據,然後將其打印出來。

printf("%d\n",x)是錯誤的,因爲您通過了doubleprintf(),但說謊它將是一個intprintf()讓你支付謊言。它從它的參數,這是一個int的大小4個字節(最有可能的,但不一定是4個字節),它抓住。如果你在前面放8個字節的字節(再次,最有可能的,但不一定是8個字節)的double 4.0,它的那些4個字節正好是全零,然後將它們解釋爲一個整數,並打印它。事實上,在IEEE-754雙精度格式的2的冪通常具有52個零比特,或者說是零超過6 8位字節。

這些「最有可能,但不一定」的詞語意味着C標準沒有爲類型指定固定大小和範圍,並且它們可能因編譯器,編譯器,從OS到OS而不同。目前最常見的是4字節ints和8字節doubles(如果我們考慮的話,例如x86平臺)。

+0

你能告訴我演員和轉換之間的區別嗎? – 2016-08-22 19:26:46