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

直接上代码:

#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;
}

图:




posted @ 2017-07-31 09:57  yfceshi  阅读(182)  评论(0编辑  收藏  举报