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

How can you safely compare a 32-bit integer with 64-bit integer in C++ and how signed integer is compared internally?

本文关键字:整数 比较 带符号 在内部 64位 32位 C++ 安全      更新时间:2023-10-16

问题实际上来自这个片段

 int a = -1;
 unsigned int c=1;
 long long b = c<<31;
 printf("%d %lld %dn",a,b,a>b);

我在Linux gcc(gcc(4.4.6 20110731(Red Hat 4.4.6-3(上测试了它,结果是:-1 2147483648 0

事实上,我无法理解结果。我认为,当你做a>b时,a首先转换为长-长,所以a是0000…01111…1(32个零+32个一(,b是000…01000…00(32个0+1+31个零(,那么a应该大于b。

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

在比较之前,a的值将转换为值为-1的long long

结果是正确的。a是一个有符号的int,所以-1是负数。b是一个有符号的长-长;它有一个正数。当然,负数不大于正数。

如果你想(出于某种原因!(将a显示为无符号长整型,可以这样做:

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

如果您想将其强制转换为无符号长整型:

无符号长-长a=ax;

如果你想将它与b进行比较,从而将其视为一个无符号的长-长w/o,并将其声明为:

printf("%d%lld%d\n",a,b,a>(无符号长-长(b(;