web-dev-qa-db-ja.com

Cで符号なし文字を印刷するにはどうすればよいですか?

Charを正の値として出力しようとしています:

char ch = 212;
printf("%u", ch);

しかし、私は得る:

4294967252

出力で212を取得するにはどうすればよいですか?

51
Anton

chとして宣言します

unsigned char ch = 212 ;

そして、printfは動作します。

35
user1944441

このコードには2つのバグがあります。まず、署名付きcharを使用するほとんどのC実装では、212が8ビットの署名付きcharに適合しないため、char ch = 212にオーバーフローがあり、C標準は次の場合の動作を定義しません整数オーバーフローがあります。代わりに:

unsigned char ch = 212;

次に、printf("%u",ch)で、chが通常のC実装でintに昇格されます。ただし、%u指定子はunsigned intを想定しており、C標準は、間違った型が渡されたときの動作を定義しません。代わりに:

printf("%u", (unsigned) ch);
10

charはデフォルトでsignedが宣言されているため、変数の範囲は

-127から+127>

あなたの価値があふれています。目的の値を取得するには、unsigned修飾子を宣言する必要があります。修飾子の(unsigned)範囲は次のとおりです。

 0 to 255

任意のデータ型の範囲を取得するには、プロセス2^bitの例charisは8ビット長で、範囲を取得するには2 ^(power) 8だけです。

1

Charの範囲は127〜-128です。 212を割り当てると、chは212ではなく-44(212-128-128)を保存するため、負の数を符号なしとして出力しようとすると、(unsigned intの最大値)-abs(number)が得られます=この場合、4294967252

したがって、212をchのまま保存したい場合は、chを次のように宣言するだけです。

unsigned char ch;

現在、chの範囲は0〜255です。

1
banarun

何らかの理由で宣言を変更できない場合は、次のことができます。

char ch = 212;
printf("%d", (unsigned char) ch);
1
Makketronix