-1

質問は実際にはこのスニペットから来ています

 int a = -1;
 unsigned int c=1;
 long long b = c<<31;

 printf("%d %lld %d\n",a,b,a>b);

Linux gcc (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3) でテストしました。結果は -1 2147483648 0 です。

実際、私は結果を理解できません。私の意見では、a>b を実行すると、最初に a が long long に変換されるため、a は 0000...01111...1(32 個のゼロ + 32 個の 1)、b は 000..01000...00 ( 32 個のゼロ + 1 個のゼロ + 31 個のゼロ) の場合、a は b より大きくなければなりません。

C ++で整数比較の何かが欠けていますか?

4

2 に答える 2

1

比較の前に、 の値は-1 のままaの に変換されます。long long

于 2013-03-27T18:20:17.707 に答える
0

結果は正しいです。a は符号付き int であるため、-1 は負です。b は符号付き long long です。正の兆候があります。もちろん、負の数は正の数よりも大きくありません。

(何らかの理由で!) a を unsigned long long として表示したい場合は、次のようにします。

printf("%ull %lld %d\n",a,b,a>b);

unsigned long long に強制したい場合:

unsigned long long a=ax;

そして、それを b と比較したい場合は、それを unsigned long long として扱い、そのように宣言しません:

printf("%d %lld %d\n",a,b, a > (unsigned long long) b);

于 2013-03-27T18:52:19.870 に答える