2016-03-22 3 views
1

は、例えば、次のコード負の数をCでよく定義された文字として出力していますか?

#include <stdio.h> 
#include <limits.h> 

int main(void) 
{ 
    char a; 
    signed char b; 
    for(a = CHAR_MIN, b = CHAR_MIN; a < CHAR_MAX ; a++, b++) 
    printf("%c %c\n", a, b); 
} 

出力:abが負

! ! 
" " 
# # 
$ $ 
% % 
& & 
' ' 
((
…… 

は、文字がまだ画面上に印刷されています。私はこの行動が明確に定義されているのだろうか?

もしそうなら、それは標準または特定の実装によって定義されていますか?そして、そのような行動を定義することのポイントは何ですか?

+0

%cは、文字を印刷するためのものです。 %dを試してください。 – bruceg

+2

@bruceg負の値が渡されたときの "%c"の仕組みを知りたいので、 "%c"を目的に使用しました。 –

+1

%c形式で印刷する場合、ビットパターンは文字に変換されます。単純なループ**(int c = -127; c <128; C++)printf( "%d%c \ n"、c、c); **を試して、ASCIIテーブルとともに出力を調べます。 –

答えて

4

はい

値を"%c"に一致するように渡され、それが原因printf()引数の...に通常整数キャンペーンの一部としてintまたはunsignedに変換されます。

printf()intの値を参照すると、unsigned charに変換されます。それに対応する文字が印刷されます。何l長修飾子が存在しない場合

cint引数はunsigned charに変換され、得られた文字が書かれています。したがってINT_MAXの範囲内intあるいはunsignedに昇格されている任意の狭い整数型を通過C11drは§7.21.6.18

問題ではありません。

+0

これは 'unsigned char'sだけを直接出力できることを意味していますか?なぜ 'putchar()'のプロトタイプが 'int putchar(unsigned char character);ではなく' int putchar(int character); 'なのですか? –

+0

"INT_MAXの範囲内の符号なしでも問題ありません。"、§6.5.2.2を参照してください。6 – chux

+1

"ポイント"は、もちろん、負のchar値が適用されても意味を持ちません'印刷可能なテキスト'。おそらくこれは、印刷可能な文字コードがルックアップテーブルを介して取得されたときから残っているかもしれません - 負のインデックスを持つルックアップテーブルからフェッチするとUBであり、潜在的に危険です。 – usr2564301

0

200は11001000(2進数)ですので、-200は1の補数で100111000です。

'char'のサイズはわずか8ビットで、-200は00111000(= 10進数で56)です。

ASCIIコード56は「8」です。そのため、出力として「8」が表示されます。

'%d'として印刷すると、 '56'が出力として表示されます。

+0

11001000の1の補数は00110111ですが、私のマシンは2つの補数を使用します –

+0

"'char'のサイズはちょうど8ビットです。-200は00111000です(10進数で56 =)"私はそれが保証だとは思わないd。 – xaxxon

関連する問題