为什么size_t不能直接与负int进行比较?

cxs*_*031 3 c++

在我的程序一个错误是通过直接比较引起size_tint.

玩具示例代码如下:

string s = "AB";
cout << (-1 < 8888888+(int)s.size()) << endl;
cout << (-1 < 8888888+s.size()) << endl;
Run Code Online (Sandbox Code Playgroud)

输出是:

1

0

那么为什么size_t不能直接与负int进行比较呢?

Jac*_*lam 6

size_t是无符号的,因此只能表示正数.将其与否定比较将产生古怪的结果.

如果你尝试将int(-1)转换为size_t,你会发现它变成了一个巨大的数字,这解释了你所拥有的行为.


AnT*_*AnT 5

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

在第一种情况下,您强制转换size_tint,从而将您的比较变成intvs. intone 。它的行为符合预期。

请注意,顺便说一句,它std::string::size()返回std::string::size_type,这是一个无符号类型,但不一定是size_t