printf()
を検索する結果が山ほどあるため、かなり無関係な質問しか見つかりませんでした。
_uint8_t
_が独自のフォーマット文字列を指定しないのに、他の型は指定するのはなぜですか?
printf()
を理解している限り、変数の引数リストを解析できるようにするには、提供されたパラメーターの長さを知る必要があります。
_uint8_t
_と_uint16_t
_は同じフォーマット指定子_%u
_を使用するため、printf()
はどのように処理するバイト数を「認識」しますか?または、何らかの形で_uint16_t
_を提供するときに、_uint8_t
_への暗黙のキャストが関係していますか?
たぶん私は明らかな何かを見逃しています。
printf()
は可変長関数です。オプションの引数(およびそれらのみ)は、デフォルトの引数プロモーション(6.5.2.2。p6)に従って昇格されます。
整数を要求しているため、この場合、整数の昇格が適用され、言及した型はint
に昇格されます。 (Cではunsigned int
ではありません)
Printf()で"%u"
を使用し、それにuint16_t
変数を渡すと、関数はそれをint
に変換し、次にunsigned int
(に要求したため、それを%uで)してから印刷します。
%uは「符号なし」を表すため、uint64_tである可能性が高く、アーキテクチャに依存します。による man 3 printf
、%hu(uint16_t)と%hhu(uint8_t)のように、求められる動作を得るために長さ修飾子を使用できます。