1. ホーム
  2. c++

[解決済み] このプログラムはどのように機能するのですか?

2023-04-27 06:42:52

質問

#include <stdio.h>

int main() {
    float a = 1234.5f;
    printf("%d\n", a);
    return 0;
}

を表示します。 0 !! どうしてそんなことが可能なのでしょうか?その理由は何ですか?


私は意図的に %d の中に printf 文の挙動を調べるために printf .

どのように解決するのですか?

それは %dint を期待しますが、あなたはfloatを提供しました。

使用する %e / %f / %g でfloatを表示します。


0が表示される理由について。浮動小数点数は次のように変換されます。 double に送る前に printf . リトルエンディアンの二重表現で1234.5という数値は

00 00 00 00  00 4A 93 40

A %d は32ビット整数を消費するので、0が出力されます。(テストとして printf("%d, %d\n", 1234.5f); を出力することができます。 0, 1083394560 .)


なぜ float が変換され double であるため、printf のプロトタイプは int printf(const char*, ...) であるため、6.5.2.2/7より。

関数プロトタイプの宣言子で省略記法を使用すると、最後に宣言されたパラメータの後で引数の型変換が停止します。 デフォルトの引数昇格は、末尾の引数に対して行われます。

と6.5.2.2/6からあります。

呼び出される関数を表す式がプロトタイプを含まない型を持つ場合、各引数に対して整数の昇格が行われる。 を持つ引数、および型が float に昇格される。 double . これらは デフォルト引数のプロモーション .

(これを発見してくれたAlokに感謝します。)