[英]Why does printf implicit float to int conversion not work?
請幫助我理解以下C輸出:
#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編譯器上的Ouput
4.000000
0
4
據我所讀,當我們將float分配給一個int變量時,該變量的小數部分終止,然后分配給int。
為什么在這種情況下不發生?
您不打印y
,而是再次打印x
。
附帶說明一下, printf
不能進行轉換 。 因此,在期望%d
時傳遞浮點數是未定義的行為。
據我所讀,當我們將float分配給一個int變量時,該變量的小數部分終止,然后分配給int。
聲明是正確的,但進行這種轉換必須cast
要轉換的變量,而不是僅僅把它分配給另一個int變量。
這也會在printf
語句中引起問題,因為您要打印帶有int說明符%d
的float變量,而不進行強制轉換。
修正您的代碼是這樣的:
printf("%d\n", (int) x);
^
| this is the cast operation
並且它將為變量x
正確打印整數值4
。
floats
作為...
參數傳遞時會自動提升為doubles
(類似於chars
和short ints
提升為ints
)。 當printf()
查看格式說明符( %d
或%f
或任何其他格式)時,它會根據格式說明符(如int
或double
或其他格式)捕獲並解釋接收到的原始數據,然后進行打印。
printf("%d\\n",x)
是錯誤的,因為您將double
傳遞給printf()
但謊稱它將是一個int
。 printf()
使您支付謊言。 它從其參數中獲取4個字節(最有可能,但不一定是4個字節),它是一個int
的大小,它將從您之前放置8個字節的位置(同樣,最有可能,但不一定是8個字節)中獲取這些字節。 double
4.0的整數,其中這4個字節恰好都是全零,然后將它們解釋為整數並打印出來。 實際上,IEEE-754雙精度格式中的2的冪通常具有52個零位,或者超過6個為零的8位字節。
這些“最有可能但不一定”的詞表示C標准沒有規定類型的固定大小和范圍,並且它們在編譯器之間,從OS到OS可能有所不同。 如今,最常見的是4字節ints
和8字節doubles
(如果我們考慮使用x86平台的話)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.