web-dev-qa-db-ja.com

uint8_tとuint16_tの形式指定子が同じ(%u)なのはなぜですか?

printf()を検索する結果が山ほどあるため、かなり無関係な質問しか見つかりませんでした。

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

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

_uint8_t_と_uint16_t_は同じフォーマット指定子_%u_を使用するため、printf()はどのように処理するバイト数を「認識」しますか?または、何らかの形で_uint16_t_を提供するときに、_uint8_t_への暗黙のキャストが関係していますか?

たぶん私は明らかな何かを見逃しています。

9
Rev1.0

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

整数を要求しているため、この場合、整数の昇格が適用され、言及した型はintに昇格されます。 (Cではunsigned intではありません)

Printf()で"%u"を使用し、それにuint16_t変数を渡すと、関数はそれをintに変換し、次にunsigned int(に要求したため、それを%uで)してから印刷します。

7
2501

%uは「符号なし」を表すため、uint64_tである可能性が高く、アーキテクチャに依存します。による man 3 printf、%hu(uint16_t)と%hhu(uint8_t)のように、求められる動作を得るために長さ修飾子を使用できます。

13
wick