如何安全地比较C ++中的32位整数和64位整数以及如何在内部比较有符号整数?

时间:2013-03-27 18:15:33

标签: c++ c 64-bit 32bit-64bit

这个问题实际上来自这个片段

 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 ++中缺少整数比较吗?

2 个答案:

答案 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);