int
値が に昇格されるためですunsigned int
。特に0xFFFFFFFC
32 ビット マシンでunsigned int
は4294967292
、10
C99 6.3.1.1-p2
int が元の型のすべての値を表すことができる場合 (ビットフィールドの幅によって制限されるため)、値は int に変換されます。それ以外の場合は、 unsigned intに変換されます。これらは整数プロモーションと呼ばれます。他のすべての型は、整数の昇格によって変更されません。
変換を実行するには:
C99 6.3.1.3-p2
それ以外の場合、新しい型が符号なしの場合、値が新しい型の範囲内になるまで、新しい型で表現できる最大値よりも 1 多い値を繰り返し加算または減算することによって、値が変換されます。
これは基本的に「UINT_MAX + 1を追加する」ことを意味します(とにかく読んだように)。
昇進がunsigned int
脇にあった理由について; 優先順位:
C99 6.3.1.8-p1
...それ以外の場合、符号なし整数型を持つオペランドのランクが他のオペランドの型のランク以上である場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。
それ以外の場合、符号付き整数型のオペランドの型が符号なし整数型のオペランドの型のすべての値を表すことができる場合、符号なし整数型のオペランドは符号付き整数型のオペランドの型に変換されます。
これは、 int
vs.unsigned char
が期待どおりに機能することを示しています。
テスト
int main()
{
int x = -4;
unsigned int y = 10;
unsigned char z = 10;
if (x > y)
printf("x>y\n");
else
printf("x<y\n");
if (x > z)
printf("x>z\n");
else
printf("x<z\n");
return 0;
}
出力
x>y
x<z
それを見てください。