4

可能重复:
有符号/无符号比较

所以我有下面的代码,它将 unsigned int 设置为负数,然后将 unsigned int 与相同的负数进行比较。我得到的输出是“不等于”。我知道当将 unsigned int 设置为 -1 时,在这种情况下 unsigned int 的值设置为 255。

#include <stdint.h>
#include <iostream>

int main(int argc, char **argv)
{
  uint8_t test = 0;
  int8_t set = -1;

  test = set;

  if (test == set) {
    std::cout << "Equal";
  } else {
    std::cout << "Not Equal";
  }
}

但是,是什么导致相等操作数返回 false?这似乎与类似问题有符号/无符号比较的答案直接对比

许多期望算术或枚举类型的操作数的二元运算符会以类似的方式导致转换和产生结果类型。目的是产生一个通用类型,这也是结果的类型。这种模式称为通常的算术转换,其定义如下:

如果任一操作数是 long double 类型,则另一个应转换为 long double。

否则,如果任一操作数为双精度,则另一个应转换为双精度。

否则,如果任一操作数为浮点数,则另一个应转换为浮点数。

否则,应在两个操作数上执行积分提升 (4.5)。54)

然后,如果其中一个操作数是 unsigned long,则另一个操作数应转换为 unsigned long。

否则,如果一个操作数是 long int 而另一个是 unsigned int,则如果 long int 可以表示 unsigned int 的所有值,则 unsigned int 应转换为 long int;否则,两个操作数都应转换为 unsigned long int。

否则,如果任一操作数为 long,则另一个应转换为 long。

否则,如果任一操作数是无符号的,则另一个应转换为无符号。

因此,根据这个答案,由于两个操作数都是无符号的,另一个应该被转换为无符号,并且相等应该通过。但它显然没有通过,正如在这个问题中已经回答的那样,它们都被提升为有符号整数。

4

1 回答 1

9

这确实是标准行为。与和大多数其他运算符一起使用时,小于int提升到的类型。所以被提升为,值为 255。并被提升为,但它是一个负数,所以它的值,无论是在提升之前还是之后,都是 -1。由于 255 不等于 -1,因此比较得出.int==testintsetintfalse

寓意是:在比较中混合有符号和无符号类型时要小心。

于 2012-11-07T19:20:42.063 回答