2011-07-18 3 views
1

Kernighanで&リッチーは、「印字可能な文字はすべて、符号付きまたは符号なしのcharデータ型がマシンに依存していても正の値です。printfをよく理解しています - 指定された値が負の場合は "%c"と表示されますか?

誰かが私にこの行の意味を説明できますか?私のシステムはcharsに署名していますが、-90という負の値を指定しても、printfは文字を出力します(あまりよく知られていません)。

+0

あるK&Rは、ASCII文字のみを話していた場合、それは私は驚かないだろう文字を見ています。符号付きであろうとなかろうと、0から127の範囲の値なので、すべてのASCII文字は8ビット(またはそれ以上)の表現で(技術的に)正の整数であることに注意してください。 – Mac

+0

文字の場合は、署名されていないものとして扱う。したがって、-90 = 0xFFFFFFA6 = 0xA6 = +166となります。 –

答えて

2

ASCII文字セットからコードポイントを定義0x00~0x7F。この範囲は両方に共通であるため、符号なしまたは符号付きバイト値で表されるかどうかは関係ありません。

印刷可能な文字は、すべてASCIIの一部である0x200x7Eの間にあります。 という印刷可能な文字の語義は、印刷可能なすべての可能な文字を世界で定義していません。むしろ、それはASCIIの領域内で定義されています。

0x800xFFのバイト値はASCIIで定義されておらず、異なるシステムではこの範囲の値に異なる文字が割り当てられているため、ASCII範囲では同じですが異なる範囲のコードページがあります。これは、符号付きバイトと符号なしバイトの値が異なる範囲でもあります。

printfの実装では、入力に%cというキーが見つかると、1バイトの値が検索されます。このバイト値は、printf関数の呼び出し元がprintfの呼び出し元がこれを認識していないため、あなたの視点に対して符号付きまたは符号なしである可能性があります。これらの8ビットを接続されている出力ストリームに渡すだけで、そのストリームは0x000xffの文字を出力します。

記号の概念は、文字が出力される出力パイプライン内で意味を持ちません。したがって、255または-1を送信するかどうかにかかわらず、特定のコードページの0xFFにマップされた文字が放出されます。

1

-90 signed char型は、値が166であるのです。その場合にはunsigned char、として再解釈されているように(-90両方と166はヘクスには0xA6である。)

1

そうです。すべての2進数は正の数です。それを否定的なものとして扱うかどうかは、あなた自身の解釈です。 the common two's complimentを使用します。

8ビットの数値:10100110は正の166で、128(正の符号付き最大8ビットの数値)より大きい。

符号付きの算術演算を使用すると、数値166は-90になります。

あなたはASCII値166

関連する問題