记录一个奇妙的Bug, -1 >= 2 ?

本文通过实例演示了C++中int与unsigned int类型比较时可能出现的问题,并解释了背后的原因。当int类型的负数与unsigned int类型进行比较时,负数会被隐式转换为unsigned int类型的最大值,从而可能导致误判。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码:

#include <iostream>
#include <vector>

using namespace std;


int main()
{
	vector<string> vctStr;
	vctStr.push_back("Hello");
	vctStr.push_back("World");

	cout<<"VctSize: "<<vctStr.size()<<endl;    // VctSize: 2

	int iType = -1;

	if (iType >= vctStr.size() )
	{
		cout<<"Amazing ……"<<endl;			// -1 竟然大于2 ?!
		cout<<"iType: "<<iType<<", size: "<<vctStr.size()<<endl;
		
	}
	
	return 0;
}

执行结果:



欧耶,-1 >=2 就这样出现了……


我一開始认为计算机是不是脑残了,会有这样的结果? 


我怀疑是 vector.size 的返回值有问题,查文档,发现原来返回类型是 size_type  也就是 unsigend int, 这下子。知道是怎么一回事了。

这样測试,结果就明了了,再上代码:

#include <iostream>
#include <vector>

using namespace std;


int main()
{
	vector<string> vctStr;
	vctStr.push_back("Hello");
	vctStr.push_back("World");

	cout<<"VctSize: "<<vctStr.size()<<endl;    // VctSize: 2

	int iType = -1;

	if (iType >= vctStr.size() )
	{
		cout<<"Amazing ……"<<endl;			// -1 竟然大于2 ?!
		cout<<"iType: "<<iType<<", size: "<<vctStr.size()<<endl;
		cout<<"Here!: iType:"<<(unsigned int)(iType)<<endl;		// 新加一行信息打印, 看到这里就懂了。
		
	}
	
	return 0;
}

上图:



计算机并没有脑残,仅仅是在比較的时候,默认做了类型转换,将负数进行了转换

即 if (iType >= vctStr.size() ) 实际上应该是   if ( (unsigned int)iType >= vctStr.size() )。 这种话,肯定是大于2的了。


为此我还专门上网查找了关于 负数在计算机中的存储问题。看完之后,明确了怎样求一个常见数据类型的最大值问题

再上代码:

#include <iostream>
#include <vector>

using namespace std;


int main()
{
	int i = -1;
	cout<<"unsigned int max: "<< (unsigned int)(i) <<endl;
	cout<<"         int max: "<< (unsigned int)(i)/2<<endl;
	
	return 0;
}

图:




转载于:https://www.cnblogs.com/yfceshi/p/7261610.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值