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

C++ 无符号和有符号类型的相等操作数行为,c++,c,C++,C,可能重复: 下面的代码将无符号int设置为负数,然后将无符号int与相同的负数进行比较。我得到的输出是“不相等的”。我知道,当将无符号int设置为-1时,在本例中,无符号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

可能重复:

下面的代码将无符号int设置为负数,然后将无符号int与相同的负数进行比较。我得到的输出是“不相等的”。我知道,当将无符号int设置为-1时,在本例中,无符号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";
  }
}
#包括
#包括
int main(int argc,字符**argv)
{
uint8_t检验=0;
int8_t set=-1;
测试=设置;
如果(测试==设置){

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


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

-Wall-Werror会告诉你确切的原因。在类型比较中,有符号/无符号不匹配。@larsmans-很容易忽略赋值
test=set
。小心使用标准库名称,如
set
作为变量。@WhozCraig-I知道代码是错误的,我只是问行为背后的基本规则。谢谢你的回答,这似乎与比较无符号整数和有符号整数时的情况相矛盾。我的问题是为什么它不同?@umps-有一些无符号类型的值不能表示为相应的有符号整数类型,反之亦然,因此大于或等于
int
的类型的规则会执行不同的升级设置。