ホームページ > バックエンド開発 > C++ > 単一の文字を 16 進数として印刷すると、「printf」が予期しない結果を生成するのはなぜですか?

単一の文字を 16 進数として印刷すると、「printf」が予期しない結果を生成するのはなぜですか?

Patricia Arquette
リリース: 2024-12-08 09:31:17
オリジナル
369 人が閲覧しました

Why Does `printf` Produce Unexpected Results When Printing Single Characters as Hex?

文字 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート