Asigned int
は署名され、anunsigned int
は署名されていません。just を使用する場合はint
、 を意味しsigned int
ます。short
、long
またはについても同様ですlong long
。しかし、それは真実ではありませんchar
。Asigned char
は署名され、 anunsigned char
は署名されていませchar
んが、署名されているか署名されていない可能性があります。データ型 char は「文字」を保持することになっているため、名前が付けられているため、計算で使用される整数を保持するのは「実際には」整数型ではありません。もちろん、文字は実際にはある種の整数ですが、その種類は実装に依存します (C 標準は特定の種類を強制しません)。したがって、整数値 (計算でも使用される) に char 型を使用する場合は、常にsigned char
orunsigned char
を明示的に使用し、単にchar
実際に文字を扱っている場合、または char が署名されているか署名されていない場合でもコードにまったく違いがない場合。
char
実装が be in fact と定義されているため、比較は失敗します。そのため、最終ステートメントでsigned char
asigned char
と anを比較しています。異なる型の 2 つの整数を比較する場合、コンパイラは、実際に比較を実行する前に、C 標準の規則に従って両方の値を同じ型に変換します。あなたの場合、これはCコンパイラが実際に次のことを行うことを意味します:unsigned char
if
if((int)a==(int)b) printf("equal\n");
else printf("not equal\n");
}
これで、これら 2 つの値が一致しない理由が明らかになったはずです。(int)a
の値は です-1
が(int)b
、 の値は255
であり、これら 2 つの値は等しくありません。
タイプ Promotionの規則によれば、char
(あなたの場合は signed) は に昇格されint
、unsigned char
また に昇格されint
ます。ISO C 2011 標準には、次のように記載されています。
int が元の型のすべての値を表すことができる場合 (ビットフィールドの幅によって制限されるため)、値は int に変換されます。それ以外の場合は、unsigned int に変換されます。これらは、整数昇格と呼ばれます。) 他のすべての型は、整数昇格によって変更されません。
整数昇格は、符号を含む値を保持します。前に説明したように、''プレーンな'' char が符号付きとして扱われるかどうかは処理系定義です。