4

Cプログラミング言語のcharは、ASCIIなどのエンコーディングからの文字値を格納するのに十分な大きさになるように特別に設計された固定サイズのバイトエンティティです。

しかし、ASCIIエンコーディングに関連する整数値はchar文字とどの程度交換可能ですか?'A'を65(10進数)と呼ぶ方法はありますか?

getchar()は整数を返します-おそらくこれはそのような値に直接関係していますか?また、私が間違っていなければ、特定のコンテキストで文字をインクリメントすることができます...(大まかに言えば)'?' + 1=='@'のように。

または、そのようなエンコーディングはASCIIであることが保証されていませんか?それは完全に特定の環境に依存しますか?Cでは、このような文字の操作は非現実的ですか、それとも不可能ですか?

編集:関連:C比較charおよびint

4

4 に答える 4

6

他の問題は他の回答で対処されているので、私は文字のインクリメントに関する質問に答えています。

C標準では、「0」から「9」が連続していることが保証されているため、1桁の文字(「9」を除く)をインクリメントして次の桁の文字を取得するか、それらを使用して他の演算を実行できます(C 1999 5.2.13)。

他の文字間の関係はC標準によって保証されていないため、これに関する特定のC実装(主にコンパイラ)からのドキュメントが必要になります。

于 2012-12-11T19:51:53.933 に答える
4

しかし、ASCIIエンコーディングに関連する整数値はchar文字とどの程度交換可能ですか?'A'を65(10進数)と呼ぶ方法はありますか?

実際、他に何もできません。charは単なる整数型であり、

char ch = 'A';

次に(ASCIIを想定して)、ch整数値を保持するだけです65-それをユーザーに提示することは別の問題です。

または、そのようなエンコーディングはASCIIであることが保証されていませんか?

いいえ、そうではありません。Cは特定の文字エンコードに依存しません。

それは完全に特定の環境に依存しますか?

はい、ほとんどです。

Cでは、このような文字の操作は非現実的ですか、それとも不可能ですか?

いいえ、注意して標準を十分に理解する必要があります。そうすれば安全になります。

于 2012-12-11T19:45:27.960 に答える
2

'A'のような文字リテラルのタイプintは..整数値と完全に交換可能です。ただし、その整数値はC標準では必須ではありません。ASCIIである可能性があります(そして、一般的な実装の大部分に使用されます)が、そうである必要はありません。実装定義です。文字の整数値のマッピングには、標準で指定されている1つの保証があります。10進数の値は連続しています。(つまり、 '1'-'0' == 1、... '9'-'0' == 9)。

于 2012-12-11T19:47:37.397 に答える
1

ソースコードにが含まれている'A'場合、コンパイルされたオブジェクトには代わりにバイト値が含まれます。そのため、バイトを使用して算術演算を実行できます(のタイプ'A'char、つまりバイトです)。

もちろん、そのバイト値を取得するには文字エンコード(より正確にはコードページ)を適用する必要があり、そのコードページはハードコードされた文字列とchar値のコンパイラの「ネイティブ」エンコーディングとして機能します。

char大まかに言うと、Cソースの文字列リテラルは本質的にマクロであると考えることができます。ASCIIシステムでは、「マクロ」'A'はに解決さ(char) 65れ、EBCDICシステムではに解決され(char) 193ます。同様に、C文字列はchars(バイト)のゼロで終了する配列にコンパイルされます。シンボルはネイティブエンコーディングでソースから取得されるため、このロジックはシンボルテーブルにも影響します。

したがって、ソースコードでリテラルをエンコードする可能性はASCIIだけではありません。ただし、一重引用符で囲まれた文字がsであるという制限によりchar、UTF-16またはその他のマルチバイトエンコーディングが除外されることが保証されています。

于 2012-12-11T20:39:08.027 に答える