7

1 つが unsigned int32 で、もう 1 つが signed int32 である 2 つの int を比較する方法を理解するのに苦労しています。この単純なプログラムを考えてみましょう:

#include <stdint.h>

int main()
{
    uint32_t a1 = UINT32_MAX;
    int32_t b1 = (int32_t)a1;

    if (a1 == b1)
        printf("Equal");
    else
        printf("Not equal");

    return 0;
}

この場合、a1は符号付き 32 ビット整数の範囲を超えているため、デバッグ中に確認したように、キャストされた後は にb1等しくなり-1ます。ただし、これらの値は明らかに同じではありませんが、それでも「等しい」と出力されます。何が原因ですか?

4

3 に答える 3

4

ビルトイン==は、同じ型の値のみを比較できます。オペランドの型が異なる場合は、事前に同じ型に変換されます。(このタイプの選択方法については、cppreferenceを参照してください。)

この場合、比較が実行される前に にb1変換されます。uint32_t

于 2019-11-12T23:18:53.667 に答える