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
是一个有符号值将被转换为一个无符号值:
基本上我们的比较将变成:
18446744073709551615 > 4294967295
但我的 c
结果是 false
。我在这里错过了什么?
答案 0 :(得分:4)
给定 int64_t a
和 uint32_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) 是对算术或枚举类型的操作数执行的。”>