以下のプログラムを実行してみました:
#include <stdio.h>
int main() {
signed char a = -5;
unsigned char b = -5;
int c = -5;
unsigned int d = -5;
if (a == b)
printf("\r\n char is SAME!!!");
else
printf("\r\n char is DIFF!!!");
if (c == d)
printf("\r\n int is SAME!!!");
else
printf("\r\n int is DIFF!!!");
return 0;
}
このプログラムでは、次のような出力が得られます。
char は違います!!! int は同じです!!!
なぜ両方で異なる出力が得られるのでしょうか?
出力は以下のようになるべきでしょうか?
char は同じです!!! int も同じです!!!
ベストアンサー1
これは、C のさまざまな暗黙的な型変換ルールによるものです。C プログラマが知っておく必要があるルールは次の 2 つです。通常の算術変換そしてその整数昇格(後者は前者の一部です)。
char型の場合は、型があります(signed char) == (unsigned char)
。これらは両方とも小さな整数型他にもこのような小さな整数型としては、bool
と があるshort
。整数の昇格規則int
小さな整数型が演算のオペランドである場合、その型は符号付きの に昇格されると述べています。これは、型が符号付きか符号なしかに関係なく発生します。
の場合signed char
、符号は保持され、値 -5 を含む に昇格されますint
。 の場合unsigned char
、値 251 (0xFB ) が含まれます。 はint
同じ値を含む に昇格されます。 結果は次のようになります。
if( (int)-5 == (int)251 )
整数の場合は、型 があります(signed int) == (unsigned int)
。これらは小さな整数型ではないので、整数の昇格は適用されません。代わりに、次の式でバランスが取られます。通常の算術変換は、2つのオペランドが同じ「ランク」(サイズ)を持ち、符号が異なる場合、符号付きオペランドは符号なしオペランドと同じ型に変換されることを示しています。
if( (unsigned int)-5 == (unsigned int)-5)