10
  1. 'C'の文字は、文字を表すために使用されます。
  2. すべてのコードページの文字を表す数字は常に正です。

署名された文字を持つことの使用は何ですか?charsに含まれる負の値は、intおよびshortよりも小さい整数データ型の整数値としてのみ使用されますか?他に解釈はありませんか??(文字を表す文字の正の値など)

4

8 に答える 8

12

'C'の文字は、文字を表すために使用されます。

常にではありませんが、文字はバイトを表すために使用されます。文字は、既知のサイズを持つcの唯一のタイプです。

于 2009-12-21T15:51:49.673 に答える
5

基本実行文字セットの文字のみが非負であることが保証されています (C99、6.5.2 §3):

char 型として宣言されたオブジェクトは、基本実行文字セットの任意のメンバーを格納するのに十分な大きさです。基本実行文字セットのメンバーが char オブジェクトに格納されている場合、その値は負でないことが保証されます。他の文字が char オブジェクトに格納されている場合、結果の値は実装定義ですが、その型で表現できる値の範囲内でなければなりません。

「プレーン」charタイプとタイプsigned charを区別する必要があり、unsigned char以下が保持signed charunsigned charれる通常の整数タイプです (C99、6.5.2 §5):

signed char 型として宣言されたオブジェクトは、''プレーンな'' char オブジェクトと同じ量のストレージを占有します。

于 2009-12-21T16:07:10.090 に答える
4

すべてのコード ページの文字を表す数値は常に正です。

えっと…違う!?

C99標準から、強調鉱山:

基本実行文字セットのメンバーがchar オブジェクトに格納されている場合、その値は正であることが保証されます。

すべてのコード ページのすべての有効な文字が正であるとは限りません。署名付きか未署名かcharは実装定義です!

于 2009-12-21T16:05:06.927 に答える
2

配列インデックスとしてプレーン文字を使用することに注意してください。

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++;
}
于 2009-12-21T16:37:40.510 に答える
2

ジャック・クラインのホームページから:

符号付き 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 つ以上あることを意味する負の戻り値を定義するかもしれません。これは必ずしも良い方法とは限りません。これは私の思いつきの一例にすぎません。

于 2009-12-21T15:59:24.633 に答える
1

char は、signed char と unsigned char の両方とは異なる型であることに注意してください。

于 2009-12-21T16:49:05.130 に答える
0

Cでは、a charsigned charおよびを含む)を使用してバイトunsigned charを格納します。これは、C標準で少なくとも8ビットのサイズの小さな整数として定義されています。

符号付きバイトと符号なしバイトがあると、整数が大きくなるのと同じくらい便利です。非常に多くの小さな数値(unsignedの場合は0..255、signed [1]の場合は-127..127)を配列に格納する場合は、たとえば短いintではなく、バイトを使用することをお勧めします。 、スペースを節約します。

歴史的に、バイトとテキスト文字はほとんど同じものでした。それから誰かが英語よりも多くの言語があることに気づきました。最近では、テキストははるかに複雑になっていますがchar、Cで型の名前を変更するには遅すぎます。

[1]負の数の2の補数表現を持つマシンの場合、-128..127ですが、C標準はそれを保証しません。

于 2009-12-21T16:33:08.273 に答える
0

C および C++ では、文字は符号付きでも符号なしでもかまいません。char 変数は、小さな整数値を保持するために使用できます。これはいくつかの理由で便利です:

  • 8ビットマイクロなどの小型マシン。より効率的なアクセスと操作が可能になる可能性があります。
  • 100K などの小さな値の大きな配列が必要な場合は、char の配列ではなく、char の配列を使用して大量のメモリを節約できます。たとえば、int。

C では、文字リテラルは整数定数です。「0」は 48 に等しい。

于 2009-12-21T16:00:03.520 に答える