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

时间:2012-11-07 19:14:43

标签: c++ c

  

可能重复:
  Signed/unsigned comparisons

所以我有下面的代码,它将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?这似乎与类似问题Signed/unsigned comparisons的答案形成鲜明对比,后者表示

  

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

     

如果任一操作数的类型为long double,则另一个操作数将被转换   加倍。

     

否则,如果任一操作数为double,则另一个操作数将被转换   加倍。

     

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

     

否则,应对两者进行整体促销(4.5)   operands.54)

     

然后,如果任一操作数是无符号长的,则另一个操作数将被转换   无条件的。

     

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

     

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

     

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

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

1 个答案:

答案 0 :(得分:9)

确实是标准行为。与int和大多数其他运算符一起使用时,小于int的类型会提升为==。因此test被提升为int,其值为255. set被提升为int,但它是一个负数,因此它的值在促销之前和之后,是-1。由于255不等于-1,因此比较结果为false

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