C++ 为什么可以';t size\u不能直接与负int进行比较?

C++ 为什么可以';t size\u不能直接与负int进行比较?,c++,C++,我的程序中有一个错误是直接将size\u t与int进行比较造成的 玩具示例代码如下所示: string s = "AB"; cout << (-1 < 8888888+(int)s.size()) << endl; cout << (-1 < 8888888+s.size()) << endl; string s=“AB”; cout因为size\u t是无符号的,而int是有符号的。语言对于这种“混合”比较以及

我的程序中有一个错误是直接将
size\u t
int
进行比较造成的

玩具示例代码如下所示:

string s = "AB";
cout << (-1 < 8888888+(int)s.size()) << endl;
cout << (-1 < 8888888+s.size()) << endl;
string s=“AB”;

cout因为
size\u t
是无符号的,而
int
是有符号的。语言对于这种“混合”比较以及“混合”算术有特殊的规则。在这种情况下,这些规则规定所有内容都应转换为
size\t
。转换为无符号的
size\u t
,会极大地扭曲
int
的原始值(
-1
变成
size\u MAX
),这就是第二种情况下导致“奇怪”结果的原因

在第一种情况下,您强制将
size\u t
转换为
int
,从而将比较变成
int
int
的比较。它以预期的方式运行


请注意,顺便说一句,
std::string::size()
返回
std::string::size\u type
,这是一种无符号类型,但不一定
size\u t
size\u t是无符号的,因此只能表示正数。将其与负片进行比较会产生奇怪的结果


如果您尝试将int(-1)转换为size\t,您会发现它变成了一个巨大的数字,这解释了您的行为

size\u t
未签名。你怎么把它和负值比较呢?哦,我知道了!谢谢在有人生气之前,我会修改我的问题。:)很遗憾他们选择了这个方向。因为size\u t通常是一个小整数,所以不太令人惊讶的隐式强制转换应该是(有符号)size>-1,而不是size>(无符号)-1