-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 个),b 为 000..01000...00( 32 个零 + 一个 + 31 个零),那么 a 应该大于 b。

我是否缺少 C++ 中的整数比较?

4

2 回答 2

1

在比较之前, 的值a被转换为long long仍然具有值 -1 的 a。

于 2013-03-27T18:20:17.707 回答
0

结果是正确的。a 是有符号整数,所以 -1 是负数。b 是有符号的 long long;它有一个积极的迹象。当然负数不大于正数。

如果您想(出于某种原因!)将 a 显示为 unsigned long long,则可以这样做:

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

如果您想将其强制为 unsigned long long:

无符号 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 回答