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