69

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

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

しかし、私は得る:

4294967252

どうすれば212出力に入ることができますか?

4

6 に答える 6

43

chあなたを宣言する

unsigned char ch = 212 ;

そしてあなたのprintfはうまくいきます。

于 2013-04-01T01:35:55.387 に答える
39

これは、この場合、charタイプがシステムで署名されているためです*。これが発生すると、デフォルトの変換中にデータが符号拡張され、可変数の引数でデータが関数に渡されます。212 は 0x80 より大きいため、負として扱われ%u、数値を大きな正の数として解釈します。

212 = 0xD4

符号拡張FFすると、番号の前に s が追加されるため、次のようになります。

0xFFFFFFD4 = 4294967252

これは、印刷される番号です。

この動作は実装に固有のものであることに注意してください。C99 仕様によると、すべてのchar型は (signed) に昇格されます。これは、 は、符号付きまたは符号なしの a のすべての値を表すことができるintためです。intchar

6.1.1.2:intが元の型のすべての値を表すことができる場合、値はint;に変換されます。それ以外の場合は、に変換されますunsigned int

intこれにより、が必要なフォーマット指定子%uにが渡されますunsigned int

プログラムで未定義の動作を回避するには、次のように明示的な型キャストを追加します。

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


*一般に、標準ではchar、実装にまでの署名が残されています。詳細については、この質問を参照してください。

于 2013-04-01T01:36:30.797 に答える
19

このコードには 2 つのバグがあります。まず、signed を使用するほとんどの C 実装では、 212 が 8 ビットの signed に適合せず、C 標準では動作が完全に定義されていないためchar、問題があります (動作を定義するには実装が必要です)。代わりに次のようにする必要があります。char ch = 212char

unsigned char ch = 212;

2 番目の in はprintf("%u",ch)、通常の C 実装ではchan に昇格されます。intただし、%u指定子は を想定してunsigned intおり、C 標準では、間違った型が渡された場合の動作を定義していません。代わりに次のようにする必要があります。

printf("%hhu", ch);

( の場合%hhu、通常の C 実装では に昇格された がprintf期待されます。)unsigned charint

于 2013-04-01T13:57:22.513 に答える
3

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

char ch = 212;
printf("%d", (unsigned char) ch);
于 2016-03-14T02:24:25.170 に答える