_pixel_data
_は、vector
のchar
です。
printf(" 0x%1x ", pixel_data[0] )
を実行すると、_0xf5
_が表示されることを期待しています。
しかし、1バイトではなく4バイト整数を出力しているかのように_0xfffffff5
_を取得します。
どうしてこれなの? printf
にchar
を指定して印刷しました。1バイトしかないので、なぜprintf
は4を印刷するのですか?
NB。 printf
実装はサードパーティAPI内にラップされていますが、これが標準のprintf
の機能かどうか疑問に思っていますか?
%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 char
にpixel_data
を使用するか、unsigned char
を介してキャストするか、マスキング操作を使用します。プロモーション後。
例えば.
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] );
または
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
Standard-format-flagsをより適切に使用する
printf(" %#1x ", pixel_data[0] );
その後、コンパイラーが16進接頭部を付けます。
使用する %hhx
printf("%#04hhx ", foo);
その場合、length
修飾子は最小長です。
printf
の幅指定子は実際には最小幅です。 printf(" 0x%2x ", pixel_data[0] & 0xff)
を実行して下位バイトを印刷できます(pixel_data[0]
は例えば0xffffff02
)。