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

时间:2016-03-09 19:55:15

标签: c++

我的计划中的一个错误是直接将size_tint进行比较。

玩具样本代码如下:

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

输出结果为:

  

1

     

0

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

由于size_t未签名且int已签名。语言对这样的&#34;混合&#34;比较,以及&#34;混合&#34;算术。在这种情况下,这些规则规定所有内容都应转换为size_t。转换为size_t(未签名)会极大地扭曲int的原始值(-1变为SIZE_MAX),这会导致&#34;奇怪&# 34;导致第二种情况。

在第一种情况下,您强行将size_t转换为int,从而将您的比较转换为intint之一。它表现得很好。

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