1. ホーム
  2. c

[解決済み] uint8_tとuint16_tのフォーマット指定子が同じ(%u)なのはなぜですか?[重複]です。

2022-02-13 13:48:22

質問内容

で検索した結果が大量にあるため、かなり関係のない質問しか見つかりませんでした。 printf() .

なぜ uint8_t は独自のフォーマット文字列を指定しないが、他の型は指定できるのか?

私の理解では printf() 変数引数リストをパースできるようにするには、供給されたパラメータの長さを知っている必要があります。

以来 uint8_tuint16_t は同じ書式指定子を使用します。 %u は、どのように printf() は、何バイト処理すればよいかを知っているのでしょうか?それとも、何らかの方法で uint16_t を指定した場合 uint8_t ?

もしかしたら、私は明らかな何かを見逃しているかもしれません。

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

printf() は変量関数です。そのオプションの引数(そしてその引数のみ)は、デフォルトの引数プロモーション( 6.5.2.2. p6 )に従って昇格されます。

整数を要求しているので、この場合は整数のプロモーションが適用され、指定された型は次のようにプロモートされます。 int . ( unsigned int なぜならCだからです )

を使用する場合 "%u" をprintf()の中に入れて、その中に uint16_t 変数に変換し、その関数はそれを int に、そして unsigned int ( %u で要求されたから) そしてそれを印刷します。