4

重複の可能性:
負の ASCII 値

int main() {
    char b = 8-'3';
    printf("%c\n",b);

    return 0;
}

このプログラムを実行すると、疑問符 (?) のような記号が表示されます。

あなたへの私の質問は、ASCII テーブルによる b の値が存在しないマイナス 43 であることを知る限り、なぜそれが印刷され、何も印刷されないのかということです。

ちなみに、このコードをコンパイルすると:

int main() {
    char b = -16;
    printf("%c\n",b);

    return 0; 
}

私は何も得ません。

4

6 に答える 6

5

C 2011標準で指定されている動作は次のとおりです

7.21.6.1 fprintf 関数

...
8 変換指定子とその意味は次のとおり
です。 ...長さ修飾子が存在し
cない場合、引数は に変換され 、結果の文字が書き込まれます。長さ修飾子が存在する場合、 引数は、精度のない変換仕様と、 の 2 要素配列の最初の要素を指す引数、変換仕様への引数を含む最初の要素、および 2 番目の要素を指す引数であるかのように変換されます。 null ワイド文字。 lintunsigned char

lwint_tlswchar_twint_tlc

その -43 は符号なしの値 (213) に変換されているため、拡張 ASCII 文字を出力しています。

于 2012-10-31T15:55:55.693 に答える
2

-16は と同じ hex0xf0と同じだからです240。私の文字セット (ISO 8859-1) では、その文字は LATIN SMALL LETTER ETHまたは'ð'です。

于 2012-10-31T15:34:52.807 に答える
1

「負のASCII」値などはありません。ASCIIは、0から127までの値の文字コードと制御コードを定義します。

ほとんどのシステムはプレーンASCIIを使用しません。他の文字セットを使用します。他のほとんどすべての文字セットは、0〜127の値のASCIIと一致しますが、より高い値の追加の文字と制御コードを定義します。

一部のCおよびC++実装charでは、-127から+127(ほとんどの場合-128から+127)の値をとることができるsignedcharに対応します。他の実装charでは、0から255までの符号なしの値です。

負の値で署名されている場合char、それを印刷しようとすると、ライブラリはそれをunsigned char(たとえば、-1は255になります)として扱い、プラットフォームの文字セット内のその値に対応する文字を印刷します。特定の値に文字が割り当てられていない場合、ライブラリは疑問符やボックスなどのデフォルトのプレースホルダー文字を表示することを選択する場合があります。

于 2012-10-31T16:36:39.397 に答える
0

ASCII テーブルを参照できます。また、すべての数値は (256+(値))%256 にマップする必要があります (これがオーバーフローの処理方法です)。どの番号に対してどのシンボルが印刷されているかを見つけることができるはずです。

于 2012-10-31T15:43:59.933 に答える
0

文字は、印刷中に内部的に「符号なし」として解釈されます。したがって、255 - 16 = 239 番目の文字になります。オーダー 239 の ascii 値が画面コンソールに出力されます。同様に -43 は次数 212 です。

于 2012-10-31T15:42:13.943 に答える
0

フォーマットは常に文字を出力する%cため、おそらくあなたのビットを取り、charそれを符号なしの値として扱います。これは、最高のビットが設定されたものになります。お使いの端末では、これらの文字が空白または疑問符付きのプレースホルダーとして表示される場合がありますが、私の場合は Õ と ð…</p>

値が負の場合に何も出力したくない場合は、それを確認する必要があります (そして、可能性のあるすべての文字とともに非文字値を適合させることができるように、より大きなデータ型を使用するかintsigned char署名された型を取得していることを確認してください; プレーンcharは署名されているか署名されていない可能性があります)。

于 2012-10-31T15:42:22.080 に答える