2016-06-15 42 views
-2

考慮以下兩個方案:printf如何工作?爲什麼輸出不同?

#include <stdio.h> 

int main() 
{ 
    int z = 6.4; 
    printf("%d %d", z, 6.4); 
    return 0; 
} 

輸出爲6 -1717986918

#include <stdio.h> 

int main() 
{ 
    int z = 6.4; 
    printf("%d %d", 6.4, z); 
    return 0; 
} 

輸出是-1717986918 1075419545

爲什麼輸出會如此變化?當z第一次然後輸出打印正確z值是6因爲z是一個整數,但是當我顛倒了參數,輸出是一個不同的值。爲什麼它的行爲如此?

+0

我認爲這是C,但我得到相同的,如果我編譯爲C + +:語言標記可能會讓更多的人看 – doctorlove

+0

我只得到編譯器警告,說printf期待一個整數,而我餵它一個雙。但它編譯和打印兩個六次。你使用什麼編譯器? –

+0

@JanezKuhar Codeblocks –

回答

2

您存儲6.4在一個整數,這將導致z6。 6被傳遞到printf這是解釋傳遞的值作爲一個十進制,因此顯示正確的輸出。

但是,如果您將一個浮點數直接傳遞給printf,並指定格式%d,它也會將其解釋爲一個小數,這將導致該浮點的十進制解釋。

這個解釋發生在一個位平面上。浮點內部以相當複雜的格式存儲。但不像整數。 現在這些位將解釋器看作一個整數,顯然結果對於人類來說是不可讀的。但是該程序實際上可以將該整數解釋爲一個浮點數並反轉此操作。

This網站將演示如何在位級別上存儲浮點數。

而在this網站上,您可以將前一個網站的位轉換爲有符號整數,該整數應輸出您在問題中指定的負數。

+0

但在第二個程序中,%d用於z仍然不輸出6. –

+0

發生這種情況是因爲printf在內部使用可變參數,並且由於某些原因數據已損壞,因爲的錯讀。請再次嘗試此行,但使用'6.4f'作爲參數。我懷疑這是因爲編譯器將雙精度值傳遞爲6.4,因此第二個'%d'正在讀取該雙精度值的後半部分。但我可能是錯的。 –

+2

傳遞錯誤的類型會導致未定義的行爲,句點。 'printf'甚至可能不會從傳遞的數據中獲取值,而且後面的參數也會出錯。試圖闡述實際行爲是一個有爭議的問題。 – chqrlie

相關問題