首页 文章

无符号和有符号类型的等价操作数行为[重复]

提问于
浏览
3

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

所以我有下面的代码,它将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,则另一个操作数应转换为long double . 否则,如果任一操作数为double,则另一个操作数应转换为double . 否则,如果任一操作数是浮点数,则另一个操作数应转换为浮点数 . 否则,应对两个操作数执行整数提升(4.5).54)然后,如果任一操作数为无符号长,则另一操作数应转换为无符号长整数 . 否则,如果一个操作数是long int而另一个是unsigned int,那么如果long int可以表示unsigned int的所有值,则unsigned int应该转换为long int;否则两个操作数都应转换为unsigned long int . 否则,如果任一操作数很长,则另一个操作数应转换为long . 否则,如果任一操作数是无符号的,则另一个操作数应转换为无符号 .

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

1 回答

  • 8

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

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

相关问题