43
int main(void) 
{ 
     unsigned int y = 10; 
     int x = – 4; 
     if (x > y) 
        Printf("x is greater");
     else 
        Printf("y is greater"); 
     getch(); 
     return (0); 
} 

Output: x is greater

署名されていないため、出力は y の方が大きいと思いました。この背後にある理由は何ですか?

4

6 に答える 6

46

int値が に昇格されるためですunsigned int。特に0xFFFFFFFC32 ビット マシンでunsigned int429496729210

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

...それ以外の場合、符号なし整数型を持つオペランドのランクが他のオペランドの型のランク以上である場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。

それ以外の場合、符号付き整数型のオペランドの型が符号なし整数型のオペランドの型のすべての値を表すことができる場合、符号なし整数型のオペランドは符号付き整数型のオペランドの型に変換されます。

これは、 intvs.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

それを見てください。

于 2012-11-28T08:58:07.743 に答える
12

符号付きと符号なしの値の比較は、「符号なしスペース」で行われます。つまり、符号付きの値は、 を追加することによって符号なしに変換されUINT_MAX + 1ます。負の値に 2 の補数を使用する実装では、内部で値を特別に処理する必要はありません。

この例では、は明らかに である=-4に変わります。0x100000000-40xFFFFFFFC> 10

于 2012-11-28T08:44:22.077 に答える
4

とを比較するintと、unsigned intintに変換されunsigned intます。intanからanへの変換は、unsigned int追加することによって行われます(yourは負UINT_MAX+1であることに注意してください)。intだから実際にあなたは比較しています:

if (-3 + UINT_MAX > 10)  //Since -4 is converted to UINT_MAX+1-4

それは本当です。

于 2012-11-28T08:54:37.847 に答える
4

C で 2 つの値を比較する場合、両方とも同じ型でなければなりません。この場合 ( intand unsigned int)、int値は最初の値に変換されunsigned intます。

第 2 に、C の符号なし整数演算は、その型の最大値 + 1 を法として行われます (つまり、「ループする」ので、その逆も同様です) UINT_MAX + 10したがって、負の値を符号なしに変換すると、非常に大きな数値になります。

標準の関連セクションには、次のように記載されています。

6.3.1.3 符号付きおよび符号なし整数

2
それ以外の場合、新しい型が符号なしの場合、値が新しい型の範囲内になるまで、新しい型で表現できる最大値よりも 1 つ多い値を繰り返し加算または減算することによって、値が変換されます。

于 2012-11-28T08:47:06.200 に答える
1

int 値の最初のビットは、それが正か負かを定義するために使用されます。(1 = 負、0 正) 両方の変数は、最初のビットの 1 が数値の一部として解釈される比較の前に unsigned int にキャストされます。

このコードは正常に動作するはずです:

int main(void) 

 { 

    unsigned int y = 10; 
    int x = – 4; 
    if (x > (int) y) 
    Printf("x is greater");
    else 
    Printf ("y is greater"); 
    getch ( ); 
    return (0); 

 } 
于 2012-11-28T08:47:36.593 に答える
-2

int x = -4(4の2の補数は1111 1100 = 252)であり、unsigned int y = 10 is(0000 1010 = 10)なので、252> 10なので、-4は10より大きくなります。

于 2012-11-28T08:54:05.007 に答える