提问人:Andrey Chernukha 提问时间:4/27/2013 最后编辑:ChrisMMAndrey Chernukha 更新时间:9/5/2023 访问量:4055
C++ 矢量大小。为什么 -1 大于零
c++ vector size. why -1 is greater than zero
问:
请看一下这个简单的程序:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a;
std::cout << "vector size " << a.size() << std::endl;
int b = -1;
if (b < a.size())
std::cout << "Less";
else
std::cout << "Greater";
return 0;
}
我对它输出“更大”这一事实感到困惑,尽管很明显 -1 小于 0。我知道该方法返回无符号值,但比较仍适用于 -1 和 0。那么这是怎么回事呢?谁能解释一下?size
答:
2赞
Jesus Ramos
4/27/2013
#1
-1 unsigned 是高于零的值,因为高位设置为表示它是负数,但无符号比较使用此位来扩展可表示数字的范围,因此它不再用作符号位。比较是错误的。(unsigned int)-1 < 0
评论
0赞
Asteroids With Wings
3/10/2020
这与“高位”无关。这是关于规则的。规则是 -1 转换为无符号 int 环绕到无符号 int 范围的顶部。按位表示的相关性再低不过了,尽管它恰好在许多系统上匹配。
4赞
user529758
4/27/2013
#2
签名为:vector::size()
size_type size() const noexcept;
size_type
是无符号整数类型。比较无符号整数和有符号整数时,有符号整数将提升为无符号整数。此处为 negative,因此它会滚动,从而有效地生成该类型的最大可表示值。因此,它将比较为大于零。-1
size_type
10赞
juanchopanza
4/27/2013
#3
因为向量的大小是无符号整数类型。您正在将无符号类型与有符号类型进行比较,并且两者的补码负有符号整数正在提升为 unsigned。这对应于一个较大的无符号值。
此代码示例显示了您所看到的相同行为:
#include <iostream>
int main()
{
std::cout << std::boolalpha;
unsigned int a = 0;
int b = -1;
std::cout << (b < a) << "\n";
}
输出:
假
评论