为什么C++将带符号的int转换为表达式中的unsigned int?

2 c++ types casting

比较an int和an时unsigned int,例如:

signed int si = -1;
unsigned int ui = 0;

if (ui > si)
{
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

si将被转换为a unsigned int,因此它将大于ui.那么,如果结果不符合预期,为什么甚至允许这样做,是否由于历史原因这样做,如果他们不得不再次这样做,他们就不会允许它?

das*_*ght 5

C++有以下规则来决定在完成整数提升后转换两个值的类型(第5章第9节):

  • 如果两个操作数具有相同的类型,则不需要进一步转换.
  • 否则,如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数应转换为具有较大等级的操作数的类型.
  • 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有有符号整数类型的操作数应转换为具有无符号整数类型的操作数的类型.
  • 否则,如果具有有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数应转换为具有有符号整数类型的操作数的类型.
  • 否则,两个操作数都应转换为与带符号整数类型的操作数类型相对应的无符号整数类型.

最后的规则适用于这里,因为两者intunsigned int具有相同的等级.