web-dev-qa-db-ja.com

符号付き/符号なし文字の違い

したがって、符号付き整数と符号なし整数の違いは、数値が正か負かを示すためにビットが使用されることですが、これはcharにどのように適用されるのでしょうか?キャラクターはどのようにポジティブまたはネガティブになりますか?

126
Chiggins

C言語には専用の「文字タイプ」はありません。 charは整数型であり、(その点で)intshortおよびその他の整数型と同じです。 charはたまたま最小の整数型です。したがって、他の整数型と同様に、符号付きでも符号なしでもかまいません。

(名前が示すように)charは主に文字を表すために使用されることを意図しています。しかし、Cの文字は整数の「コード」で表されるため、整数型charがその目的に使用されるという事実に異常はありません。

charと他の整数型との唯一の一般的な違いは、プレーンなcharは一般にsigned charと同義ではないのに対し、他の整数型ではsigned修飾子がオプション/暗黙であることです。

117
AnT

上記に少し同意しません。 nsigned charは、単に、算術演算を実行するときに+/-符号のビットフラグとして扱うのではなく、最上位ビットを使用することを意味します。

たとえば、charを数値として使用すると重要になります。

typedef char BYTE1;
typedef unsigned char BYTE2;

BYTE1 a;
BYTE2 b;

変数aの場合、7ビットのみが使用可能で、その範囲は(-127から127)=(+/-)2 ^ 7 -1です。変数bの場合、8ビットすべてが使用可能で、範囲は0〜255(2 ^ 8 -1)です。

charを文字として使用すると、プログラムからコメントが削除されるのと同じように、コンパイラは「符号なし」を完全に無視します。

39
Simple Fellow

3つのchar型があります:(プレーン)charsigned charunsigned char。通常、任意のcharは8ビット整数*であり、その意味で、signedunsigned charには有用な意味があります(通常、uint8_tおよびint8_tと同等)。テキストの意味で文字として使用する場合は、char(プレーン文字とも呼ばれます)を使用します。これは通常signed charですが、コンパイラーでどちらの方法でも実装できます。

*技術的には、sizeof(char)が1であれば、charはどのサイズでもかまいませんが、通常は8ビット整数です。

21
DrAl

表現は同じですが、意味は異なります。例:0xFF、両方とも「FF」として表されます。 「char」として処理される場合、負の数-1です。ただし、符号なしとして255です。ビットシフトに関しては、符号ビットがシフトされないため、大きな違いです。たとえば、255を右に1ビットシフトすると、127になります。 「-1」を右にシフトしても効果はありません。

14
user2376256

「signed char」は、通常「short」よりも小さい符号付きの値であり、「short」よりも大きくならないことが保証されています。 「unsigned char」は、通常「short」よりも小さい符号なしの値であり、「short」よりも大きくならないことが保証されています。符号付きまたは符号なしの修飾子のない型「char」は、符号付きまたは符号なしのcharとして動作する場合があります。通常、これは実装定義ですが、そうでない場合がいくつかあります。

  1. ターゲットプラットフォームの文字セットで、標準Cに必要な文字のいずれかが最大符号付き文字よりも高いコードにマップされる場合、「char」は符号なしでなければなりません。
  2. 「char」と「short」が同じサイズの場合、「char」に署名する必要があります。

「C」の2つの方言がある理由の一部(「char」が署名されているものと、それが署名されていないもの)は、「char」 しなければならない 署名されていない、それ以外の場所 しなければならない 署名されます。

10
supercat

これは、charがすべての効果で8ビット数として格納されるためです。負または正のcharについて話すことは、それをASCIIコード(単に署名可能*)と考える場合は意味がありませんが、そのcharを使用して数字を格納する場合は意味があります。 2の補数表現に従って、範囲は0〜255または-128..127です。

*:署名されていない場合もありますが、実際には実装に依存します。その場合、使用されるエンコーディングによって提供される拡張ASCII文字セットにアクセスできます

2
Jack

intが正または負になる方法と同じ方法。違いはありません。実際、多くのプラットフォームでは、修飾されていないcharが署名されています。

1
Let_Me_Be

同じ方法-例えば8ビットのcharがある場合、7ビットが大きさ、1が符号に使用できます。したがって、符号なし文字の範囲は0〜255であり、符号付き文字の範囲は-128〜127です(たとえば)。

1
Stuart Golodetz