5

文字定数はintC では型を持ちます。

ここで、私のマシンのローカル文字セットが Windows Latin-1 ( http://www.ascii-code.com/ ) であるとします。これは 256 文字セットであるためchar、 のような単一引用符の間は 0 から 255 の間'x'の値にマップされます。 int?

プレーンcharsigned私のマシンにあると仮定し、次のコードを検討してください。

char ch = 'â'

if(ch == 'â')  
{
    printf("ok");
}

整数の昇格chにより、タイプの負の数量に昇格されint(先頭にゼロがあるため) â、正の数量にマップさokれると印刷されません。

しかし、私は何かが欠けていると確信しています。助けてもらえますか?

4

3 に答える 3

1

C実装には、実行文字セットの概念があります。さらに、プログラムのソースコードがファイルから読み取られる場合(いつものように)、コンパイラはソース文字セットの概念を持っています(または持っている必要があります) 。たとえば、GCCでは、コマンドラインでこれらのパラメーターを調整できます。これら2つの設定の組み合わせにより、リテラルに割り当てられる整数値が決まります â

于 2012-07-27T14:12:22.650 に答える
1

実際、最初の割り当ては期待どおりに機能しません。

char ch = 'â';

ここにはオーバーフローがあり、gcc はそれについて警告します。技術的には、これは未定義の動作ですが、非常に一般的なシングルバイトchar型の場合、動作は十分に予測可能です。単純な整数オーバーフローです。デフォルトの文字セットによっては、これはマルチバイト文字です。マシンで整数として出力すると、10 進数の 50082 が得られます。

さらに、比較対象charの値を保持するには小さすぎるため、比較は無効であり、優れたコンパイラはこれについて警告します。

ISO C はwchar_t、多くのライブラリ関数のワイド文字バージョンと共に、拡張 (つまり、非 ASCII) 文字を保持するのに十分な幅の型である を定義します。非 ASCII テキストを処理する必要があるコードでは、当然のことながら、このワイド文字型を使用する必要があります。

于 2012-07-27T14:11:18.610 に答える
0

char署名されている場合:

を処理するときchar ch = 'â'、コンパイラはâを0xFFFFFFE2に変換し、0xE2をchに格納します。値が署名されているため、オーバーフローは発生しません。

を処理するときif(ch == 'â')、コンパイラはch(0xE2)を整数(0xFFFFFFE2)に拡張し、それを'â'(0xFFFFFFE2も)と比較するため、条件は真になります。

于 2012-07-27T14:34:47.690 に答える