这个问题实际上来自这个片段
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
其实我无法理解结果。我的意见是,当你做一个&gt; b时,a首先被转换为long long,所以a是0000 ... 01111 ... 1(32个零+32个),b是000..01000 ... 00( 32个零+一个+31个零,然后a应该大于b。
我在C ++中缺少整数比较吗?
答案 0 :(得分:1)
在比较之前,a
的值会转换为仍然具有值-1的long long
。
答案 1 :(得分:0)
结果是正确的。 a是带符号的int,因此-1为负数。 b是签名长的;它有一个积极的迹象。当然,负数不大于正数。
如果你想(出于某种原因!)显示一个unsigned long long,那就可以了:
printf(“%ull%lld%d \ n”,a,b,a&gt; b);
如果你想把它强制成一个无符号的长长号:
unsigned long long a = ax;
如果你想将它与b进行比较,从而将其视为无符号长整数而不是将其声明为:
printf(“%d%lld%d \ n”,a,b,a&gt;(unsigned long long)b);