你能解释一下为什么下面的代码会给出这些结果吗?
#include <iostream>
int main()
{
int x = -1;
unsigned int y = 1;
if (x > y)
std::cout << "true";
else
std::cout << "false";
}
输出=
这里发生的是从int
到unsigned int
的隐式转换,它以以下方式发生:
int x = -a;
unsigned int y = x; //As far as y can hold only positive values,
//it now holds UINT_MAX - (a + 1)
其中UINT_MAX
为宏,定义为unsigned int
所能容纳的最大值。
在您的示例中,x
被转换为UINT_MAX
, CC_7显然大于1
下面的代码:
int x = -1;
unsigned int y = 1;
bool result = x > y;
转换为:
int x = -1;
unsigned int y = 1;
bool result = operator>(x, y);
有两个操作符>功能定义:
bool operator>(int, int);
bool operator>(unsigned int, unsigned int);
但是你正在呼叫operator>(int, unsigned int)
。所以编译器将你的有符号整型转换成无符号整型,然后调用operator>(unsigned int, unsigned int)
,这导致了一个错误。
要修复代码中的错误,可以显式地告诉编译器如何将实参转换为比较操作符
#include <iostream>
int main()
{
int x = -1;
unsigned int y = 1;
if (x > static_cast<int>(y))
std::cout << "true";
else
std::cout << "false";
}
但是要小心,因为如果unsigned int大于int可容纳的数字,它仍然可能导致错误。最安全的解决方案是使这两个变量在开始时都是相同的类型。