簡體   English   中英

為什么printf隱式將float轉換為int無效?

[英]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 (類似於charsshort ints提升為ints )。 printf()查看格式說明符( %d%f或任何其他格式)時,它會根據格式說明符(如intdouble或其他格式)捕獲並解釋接收到的原始數據,然后進行打印。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM