バイトを 16 進数で印刷するときの printf の予期しない出力について
char 要素を含むピクセルデータのようなベクトル データ型を扱う場合、一般的に次のことが行われます。 1 バイトを 16 進形式で印刷しようとすると、予期しない結果が発生します。具体的には、 printf(" 0x%1x ",xel_data[0] ) を使用して Pixel_data[0] を出力すると、予想される 0xf5 ではなく 0xfffffff5 が生成される可能性があります。
この動作は、%x 修飾子が使用される printf の特性から発生します。引数として符号なし整数を想定します。その結果、char 値は、通常、varargs 関数に指定されると整数に昇格されますが、printf では int として扱われます。
信頼できる結果を得るには、unsigned int への明示的なキャストが推奨されます。 :
printf(" 0x%1x ", (unsigned)pixel_data[0] );
さらに、フィールド幅 1 は表示する最小桁数を指定し、少なくとも 1 桁を指定するため、理想的ではない可能性があります。常に数字が使用されます。
システム上の char が signed 型として処理される場合、変換により、負の char 値に対して大きな unsigned int 値 (fffffff5 など) が生成される可能性があります。バイト値が符号なしとして扱われるようにするには、pixel_data に unsigned char を使用するか、unsigned char 経由でキャストするか、マスキング操作を使用します:
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] ); printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
以上がバイトを印刷するときに「printf」が予期しない 16 進出力を表示するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。