%hn
and %hhn
(h
またはがポイントされたhh
オブジェクトのサイズを指定する場合)を除いて、フォーマット指定子のand修飾子のポイントは何ですか?h
hh
printf
可変個引数関数に適用するために標準で要求されるデフォルトのプロモーションのため、タイプchar
またはshort
(またはその符号付き/符号なしのバリアント)の引数をに渡すことはできませんprintf
。
7.19.6.1(7)によると、h
修飾子は次のとおりです。
次のd、i、o、u、x、またはX変換指定子がshortintまたはunsignedshort int引数に適用されることを指定します(引数は整数拡張に従ってプロモートされますが、その値はshortintに変換されます。または印刷前のunsignedshortint); または、次のn変換指定子が短いint引数へのポインターに適用されます。
引数が実際にタイプshort
またはunsigned short
であった場合、に昇格したint
後にに変換するか、short
またはに変換することなく、昇格unsigned short
と同じ値を生成します。したがって、タイプまたは、、、int
などの引数の場合、、、などと同じ結果が得られるはずです(タイプとの場合も同様です)。short
unsigned short
%d
%u
%hd
%hu
char
hh
私が知る限り、h
orhh
修飾子が役立つ可能性がある唯一の状況は、引数がorのint
範囲外で渡された場合です。short
unsigned short
printf("%hu", 0x10000);
しかし、私の理解では、このような間違った型を渡すと、とにかく未定義の動作が発生するため、0を出力することは期待できませんでした。
私が見た実際のケースの1つは、次のようなコードです。
char c = 0xf0;
printf("%hhx", c);
署名されf0
たプレーンタイプの実装にもかかわらず、作成者が印刷することを期待している場合(この場合、印刷または同様のものになります)。しかし、この期待は正当化されますか?char
printf("%x", c)
fffffff0
(注:元のタイプはでしたが、ではなくにchar
プロモートされint
て変換され、出力される値が変更されます。ただし、標準ではこの動作が指定されていますか、それとも壊れたソフトウェアが実装の詳細である可能性がありますか?頼っていますか?)unsigned char
char