无签名和签名类型的平等操作数行为

Equality operand behavior for unsigned and signed types

本文关键字:操作数 类型      更新时间:2023-10-16

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

因此,我有以下代码,该代码将无符号的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";
  }
}

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

许多期望算术操作数或 枚举类型导致转化和产量结果类型类型 方式。目的是产生一种常见类型,这也是 结果。该模式称为通常的算术转换, 定义如下:

如果任何一个操作数是长双重的,则应转换另一个操作数 长双人。

否则,如果两个操作数是双重的,则应转换另一个 加倍。

否则,如果两个操作数是漂浮的,则另一个应转换为 float。

否则,应在两者上进行积分促销(4.5) 操作数54)

然后,如果任一操作数未签名,则应转换另一个 长期未签名。

否则,如果一个操作数是一个长的int,而另一个则无符号int,则 那么,如果一个长int可以代表未签名int的所有值, 未签名的int应转换为长int;否则两者 操作数应转换为未签名的长时间

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

否则,如果任一操作数未签名,则应转换另一个 未签名。

因此,根据这个答案,由于两个操作数都是未签名的,因此另一个应转换为未签名,并且平等应通过。但这显然没有通过,正如这个问题中已经回答的那样,它们都被授予INT升级。

确实是标准行为。与==和大多数其他操作员一起使用时,小于int的类型将升级为int。因此,test被升至int,值255。set被提升为int,但它是一个负数,因此促销前后其值为-1。由于255不等于-1,因此比较给出false

道德是:如果您在比较中混合签名和未签名类型,请小心。

相关文章: