无符号和有符号类型的等操作数行为

ump*_*mps 3 c c++

可能重复:
签名/未签名比较

所以我有下面的代码,它将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";
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,是什么导致等操作数返回false?这似乎与类似问题的答案形成鲜明对比.签名/未签名比较表明

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

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

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

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

否则,应在两个操作数上执行整数促销(4.5).54)

然后,如果任一操作数是无符号长的,则另一个操作数应转换为无符号长整数.

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

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

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

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

Pet*_*ker 9

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

道德是:如果在比较中混合有符号和无符号类型,请小心.