したがって、符号付き整数と符号なし整数の違いは、数値が正か負かを示すためにビットが使用されることですが、これはcharにどのように適用されるのでしょうか?キャラクターはどのようにポジティブまたはネガティブになりますか?
C言語には専用の「文字タイプ」はありません。 char
は整数型であり、(その点で)int
、short
およびその他の整数型と同じです。 char
はたまたま最小の整数型です。したがって、他の整数型と同様に、符号付きでも符号なしでもかまいません。
(名前が示すように)char
は主に文字を表すために使用されることを意図しています。しかし、Cの文字は整数の「コード」で表されるため、整数型char
がその目的に使用されるという事実に異常はありません。
char
と他の整数型との唯一の一般的な違いは、プレーンなchar
は一般にsigned char
と同義ではないのに対し、他の整数型ではsigned
修飾子がオプション/暗黙であることです。
上記に少し同意しません。 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を文字として使用すると、プログラムからコメントが削除されるのと同じように、コンパイラは「符号なし」を完全に無視します。
3つのchar型があります:(プレーン)char
、signed char
、unsigned char
。通常、任意のcharは8ビット整数*であり、その意味で、signed
とunsigned char
には有用な意味があります(通常、uint8_t
およびint8_t
と同等)。テキストの意味で文字として使用する場合は、char
(プレーン文字とも呼ばれます)を使用します。これは通常signed char
ですが、コンパイラーでどちらの方法でも実装できます。
*技術的には、sizeof(char)
が1であれば、charはどのサイズでもかまいませんが、通常は8ビット整数です。
表現は同じですが、意味は異なります。例:0xFF、両方とも「FF」として表されます。 「char」として処理される場合、負の数-1です。ただし、符号なしとして255です。ビットシフトに関しては、符号ビットがシフトされないため、大きな違いです。たとえば、255を右に1ビットシフトすると、127になります。 「-1」を右にシフトしても効果はありません。
「signed char」は、通常「short」よりも小さい符号付きの値であり、「short」よりも大きくならないことが保証されています。 「unsigned char」は、通常「short」よりも小さい符号なしの値であり、「short」よりも大きくならないことが保証されています。符号付きまたは符号なしの修飾子のない型「char」は、符号付きまたは符号なしのcharとして動作する場合があります。通常、これは実装定義ですが、そうでない場合がいくつかあります。
「C」の2つの方言がある理由の一部(「char」が署名されているものと、それが署名されていないもの)は、「char」 しなければならない 署名されていない、それ以外の場所 しなければならない 署名されます。
これは、char
がすべての効果で8ビット数として格納されるためです。負または正のchar
について話すことは、それをASCIIコード(単に署名可能*)と考える場合は意味がありませんが、そのchar
を使用して数字を格納する場合は意味があります。 2の補数表現に従って、範囲は0〜255または-128..127です。
*:署名されていない場合もありますが、実際には実装に依存します。その場合、使用されるエンコーディングによって提供される拡張ASCII文字セットにアクセスできます
int
が正または負になる方法と同じ方法。違いはありません。実際、多くのプラットフォームでは、修飾されていないchar
が署名されています。
同じ方法-例えば8ビットのcharがある場合、7ビットが大きさ、1が符号に使用できます。したがって、符号なし文字の範囲は0〜255であり、符号付き文字の範囲は-128〜127です(たとえば)。