C で符号なし 8 ビット変数を正しく出力するにはどうすればよいですか?

DDD
リリース: 2024-11-11 01:13:03
オリジナル
776 人が閲覧しました

How to Print Unsigned 8-bit Variables Correctly in C  ?

C での符号なし 8 ビット変数の操作

C で符号なし 8 ビット変数を扱う場合、次のような問題が発生する可能性があります。 ostream を使用して正しく印刷してください。デフォルトでは、ostream はこれらの変数を char として解釈し、意図しない出力が発生します。

問題の理解

Unsigned char と uint8_t は両方とも 8 ビット符号なし整数を表すデータ型です。ただし、C では、 ostream がこれらの値を自動的に文字として扱うため、16 進表現が正しくなくなります。次のコード スニペットは問題を示しています:

unsigned char a = 0;
unsigned char b = 0xff;
cout << "a is " << hex << a << "; b is " << hex << b << endl;
ログイン後にコピー

出力は次のようになります:

a is ^@; b is 377
ログイン後にコピー

目的の出力の代わりに:

a is 0; b is ff
ログイン後にコピー
ログイン後にコピー

解決問題

unsigned char 変数を次のように正しく出力するには16 進数の場合は、出力する前に明示的に int にキャストする必要があります:

cout << "a is " << hex << (int) a << "; b is " << hex << (int) b << endl;
ログイン後にコピー

これにより、意図した出力が生成されます:

a is 0; b is ff
ログイン後にコピー
ログイン後にコピー

出力で先行ゼロのパディングが必要な場合は、次のコードを使用できます:

#include <iomanip>

//...

cout << "a is " << setw(2) << setfill('0') << hex << (int) a ;
ログイン後にコピー

代替解決策

MartinStettner の解決策は、この問題を解決するための代替方法を提供します。

std::cout << std::hex << static_cast<unsigned int>(a);
ログイン後にコピー

この方法は、明示的なキャストの必要性を回避し、より簡潔な解決策を提供します。

以上がC で符号なし 8 ビット変数を正しく出力するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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