web-dev-qa-db-ja.com

16進数を印刷するときにprintfが1バイトしか印刷しないのはなぜですか?

_pixel_data_は、vectorcharです。

printf(" 0x%1x ", pixel_data[0] )を実行すると、_0xf5_が表示されることを期待しています。

しかし、1バイトではなく4バイト整数を出力しているかのように_0xfffffff5_を取得します。

どうしてこれなの? printfcharを指定して印刷しました。1バイトしかないので、なぜprintfは4を印刷するのですか?

NB。 printf実装はサードパーティAPI内にラップされていますが、これが標準のprintfの機能かどうか疑問に思っていますか?

34
BeeBand

%x修飾子はunsigned intパラメーターを想定し、charは通常intにプロモートされるため、未定義の動作の良性形式を取得している可能性があります。 varargs関数。

予測可能な結果を​​得るには、charをunsigned intに明示的にキャストする必要があります。

printf(" 0x%1x ", (unsigned)pixel_data[0] );

フィールド幅の1つはあまり有用ではないことに注意してください。表示する最小桁数を指定するだけで、いずれにしても少なくとも1桁が必要です。

プラットフォームのcharが署名されている場合、この変換は負のchar値を大きなunsigned int値に変換します(例:fffffff5)。バイト値を符号なしの値として扱い、unsigned intに変換するときにゼロ拡張する場合は、unsigned charpixel_dataを使用するか、unsigned charを介してキャストするか、マスキング操作を使用します。プロモーション後。

例えば.

printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] );

または

printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
53
CB Bailey

Standard-format-flagsをより適切に使用する

printf(" %#1x ", pixel_data[0] );

その後、コンパイラーが16進接頭部を付けます。

7
user411313

使用する %hhx

printf("%#04hhx ", foo);
4
domen

その場合、length修飾子は最小長です。

3
leppie

printfの幅指定子は実際には最小幅です。 printf(" 0x%2x ", pixel_data[0] & 0xff)を実行して下位バイトを印刷できます(pixel_data[0]は例えば0xffffff02)。

2
phadej