- 'C'の文字は、文字を表すために使用されます。
- すべてのコードページの文字を表す数字は常に正です。
署名された文字を持つことの使用は何ですか?charsに含まれる負の値は、intおよびshortよりも小さい整数データ型の整数値としてのみ使用されますか?他に解釈はありませんか??(文字を表す文字の正の値など)
'C'の文字は、文字を表すために使用されます。
常にではありませんが、文字はバイトを表すために使用されます。文字は、既知のサイズを持つcの唯一のタイプです。
基本実行文字セットの文字のみが非負であることが保証されています (C99、6.5.2 §3):
char 型として宣言されたオブジェクトは、基本実行文字セットの任意のメンバーを格納するのに十分な大きさです。基本実行文字セットのメンバーが char オブジェクトに格納されている場合、その値は負でないことが保証されます。他の文字が char オブジェクトに格納されている場合、結果の値は実装定義ですが、その型で表現できる値の範囲内でなければなりません。
「プレーン」char
タイプとタイプsigned char
を区別する必要があり、unsigned char
以下が保持signed char
さunsigned char
れる通常の整数タイプです (C99、6.5.2 §5):
signed char 型として宣言されたオブジェクトは、''プレーンな'' char オブジェクトと同じ量のストレージを占有します。
すべてのコード ページの文字を表す数値は常に正です。
えっと…違う!?
C99標準から、強調鉱山:
基本実行文字セットのメンバーがchar オブジェクトに格納されている場合、その値は正であることが保証されます。
すべてのコード ページのすべての有効な文字が正であるとは限りません。署名付きか未署名かchar
は実装定義です!
配列インデックスとしてプレーン文字を使用することに注意してください。
char buf[10000];
fgets(buf, sizeof buf, stdin);
unsigned charcount[UCHAR_MAX] = {0};
char *p = buf;
while (*p) {
charcount[*p]++; /* if (*p < 0) BOOM! */
// charcount[(unsigned char)*p]++;
p++;
}
符号付き char は、limits.h で定義されている SCHAR_MIN から SCHAR_MAX の範囲内のすべての値を保持できます。SCHAR_MIN は -127 以下 (より負) である必要があり、SCHAR_MAX は 127 以上である必要があります。2 の補数表現を使用するプロセッサ用の多くのコンパイラは、-128 の SCHAR_MIN をサポートしていますが、これは標準では要求されていないことに注意してください。
私が知る限り、 の正式な「意味」はありませんsigned char
。ただし、通常の ASCII 文字はすべて 0 ~ 127 の範囲にあることに注意してください。したがって、signed char
型を使用して有効な値を 0 ~ 127 の範囲に制限し、0 未満のものをエラーとして定義できます。
たとえば、ASCII テキストを検索し、最も頻繁に出現する文字を返す関数がある場合、最も頻繁に使用される文字が 2 つ以上あることを意味する負の戻り値を定義するかもしれません。これは必ずしも良い方法とは限りません。これは私の思いつきの一例にすぎません。
char は、signed char と unsigned char の両方とは異なる型であることに注意してください。
Cでは、a char
(signed char
およびを含む)を使用してバイトunsigned char
を格納します。これは、C標準で少なくとも8ビットのサイズの小さな整数として定義されています。
符号付きバイトと符号なしバイトがあると、整数が大きくなるのと同じくらい便利です。非常に多くの小さな数値(unsignedの場合は0..255、signed [1]の場合は-127..127)を配列に格納する場合は、たとえば短いintではなく、バイトを使用することをお勧めします。 、スペースを節約します。
歴史的に、バイトとテキスト文字はほとんど同じものでした。それから誰かが英語よりも多くの言語があることに気づきました。最近では、テキストははるかに複雑になっていますがchar
、Cで型の名前を変更するには遅すぎます。
[1]負の数の2の補数表現を持つマシンの場合、-128..127ですが、C標準はそれを保証しません。
C および C++ では、文字は符号付きでも符号なしでもかまいません。char 変数は、小さな整数値を保持するために使用できます。これはいくつかの理由で便利です:
C では、文字リテラルは整数定数です。「0」は 48 に等しい。