将 int64_t 值与另一个 uint32_t 值进行比较

时间:2021-06-01 20:29:34

标签: c++

int main(){
 int64_t a = -1;
 uint32_t b = -1;

 bool c = a > b;
 std:: cout << c << std::endl;
 
 return 0;
}

我的理解是 b 较小的类型将转换为较大的 a 类型(unit32 到 int64):

Comparing int with long and others

然后 a 是一个有符号值将被转换为一个无符号值:

Signed/unsigned comparisons

基本上我们的比较将变成:

18446744073709551615 > 4294967295

但我的 c 结果是 false。我在这里错过了什么?

1 个答案:

答案 0 :(得分:4)

给定 int64_t auint32_b,在 a > b 中,b扩展到 64 位(记住,它是无符号的,所以它实际上是 4294967295 而不是 -1),然后进行比较。相关的比较是 -1 > 4294967295 为假。

the C++ standard 的相关位在“6.8.4 整数转换等级[conv.rank]”下,“有符号整数类型的等级应大于任何有符号整数类型的等级 更小的宽度。”和“任何无符号整数类型的等级应等于相应有符号整数类型的等级。”,在“7.4 常用算术转换[expr.arith.conv]”下,“否则,如果操作数的类型带符号整数类型可以表示所有的值 无符号整数类型的操作数的类型,无符号整数类型的操作数应 转换为带符号整数类型的操作数类型。”和在“7.6.9 关系运算符 [expr.rel]”下,“通常的算术转换 (7.4) 是对算术或枚举类型的操作数执行的。”