文字 16 進印刷による printf の奇妙な動作の探索
プログラミングの領域では、単一バイトを印刷する状況に遭遇することがあります。 printf を使用した 16 進形式では、予期しない結果が生じます。文字ベクトルをピクセル データとして扱う場合、興味深い例が発生します。 "%1x" 修飾子を使用して単一の文字を出力しようとすると、多くの場合、複雑な結果になります。
謎が解明されました
謎は、示された型プロモーション動作にありますprintf による。文字 (char) を varargs 関数として printf に渡す場合、通常は整数 (int) にプロモートされます。ただし、「%x」修飾子は、入力として符号なし整数 (unsigned int) を予期します。この不一致により、未定義の動作が発生します。
これを修正し、予測可能な結果を保証するには、文字を unsigned int に明示的にキャストすることが不可欠です。次の変更は、解決策を示しています。
printf(" 0x%1x ", (unsigned)pixel_data[0] );
16 進数表現には常に少なくとも 1 桁が必要であるため、このコンテキストではフィールド幅 1 の有用性が制限されていることは注目に値します。
署名付きデータと署名なしデータの影響
char が使用されるプラットフォーム上符号付きとして指定された負の文字値は、昇格時に大きな符号なし整数値に変換されます。これを回避するには、ピクセル データに unsigned char を使用するか、unsigned int キャストまたはマスク ベースのゼロ拡張を採用することを検討してください。以下に代替アプローチの例を示します。
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] ); printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
これらのソリューションは、バイト値から符号なし整数への望ましい変換を保証し、一貫性のある期待どおりの出力をもたらします。
以上が単一の文字を 16 進数として印刷すると、「printf」が予期しない結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。