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,但它输出的却是"Greater",这让我很困惑。我知道size
方法返回无符号值,但比较仍然适用于-1和0。那到底发生了什么?有人能解释一下吗?
因为向量的大小是无符号整数类型。您正在比较一个无符号类型和一个有符号类型,而这两个类型的补码负符号整数正被提升为无符号。对应于一个大的无符号值。
这个代码示例显示了您所看到的相同行为:
#include <iostream>
int main()
{
std::cout << std::boolalpha;
unsigned int a = 0;
int b = -1;
std::cout << (b < a) << "n";
}
输出:
错误
vector::size()
的签名是:
size_type size() const noexcept;
size_type
是无符号积分类型。比较无符号整数和有符号整数时,有符号整数将升级为无符号整数。这里,-1
是负的,因此它翻转,有效地产生size_type
类型的最大可表示值。因此,它将比较为大于零。
-1 unsigned是一个大于零的值,因为高位被设置为表示它是负数,但unsigned比较使用此位来扩展可表示数字的范围,因此不再用作符号位。将比较作为(unsigned int)-1 < 0
进行,这是错误的。
相关文章:
- 为什么签名字符可以保存大于 127 的值?
- 为什么它总是给我大于 4?
- 新运算符分配的大小大于声明的大小.为什么
- 为什么 UInt64 变量不能包含大于 UInt32::Max 的值?
- 为什么 ret 指令数大于调用指令数?
- 为什么我的程序跳过 while 循环? 2 大于 -1
- 为什么在视觉C++STL:"C"不大于"b"
- 为什么 CSpinButtonCtrl 不能正确处理大于 1000 的数字?
- 为什么程序显示的值大于结果或垃圾值
- 为什么C++在乘以大于 590x590 大小的矩阵时出现分割错误?
- 为什么收到的缓冲区大小大于最初通过套接字发送的大小
- 为什么代码在输入大于10的输入上会分割故障
- 为什么此代码只能识别文本文件中的第一行?输入任何大于 1 的数字都会返回"Atomic Number Not Found"
- 为什么在 c++ 中计算重复元素时,我的计数值大于数组中的元素数
- 为什么gcc允许字符串文字大于数组的char数组初始化
- 为什么要分配大小为 1 的数组大于请求的大小
- 为什么"A<0>=0"中的模板 id 由于大于或等于运算符">="而无法在没有空格的情况下编译?
- 变量的范围大于for循环,为什么它不改变值
- 为什么大于 128 的对齐方式会表现得很奇怪
- 为什么 1 不大于 -0x80000000