Asigned intは署名され、anunsigned intは署名されていません。just を使用する場合はint、 を意味しsigned intます。short、longまたはについても同様ですlong long。しかし、それは真実ではありませんchar。Asigned charは署名され、 anunsigned charは署名されていませcharんが、署名されているか署名されていない可能性があります。データ型 char は「文字」を保持することになっているため、名前が付けられているため、計算で使用される整数を保持するのは「実際には」整数型ではありません。もちろん、文字は実際にはある種の整数ですが、その種類は実装に依存します (C 標準は特定の種類を強制しません)。したがって、整数値 (計算でも使用される) に char 型を使用する場合は、常にsigned charorunsigned charを明示的に使用し、単にchar実際に文字を扱っている場合、または char が署名されているか署名されていない場合でもコードにまったく違いがない場合。
char実装が be in fact と定義されているため、比較は失敗します。そのため、最終ステートメントでsigned charasigned charと anを比較しています。異なる型の 2 つの整数を比較する場合、コンパイラは、実際に比較を実行する前に、C 標準の規則に従って両方の値を同じ型に変換します。あなたの場合、これはCコンパイラが実際に次のことを行うことを意味します:unsigned charif
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 が符号付きとして扱われるかどうかは処理系定義です。