vector.size()导致死循环的坑

首先我是在for循环中遇到的这个问题:

for(int i=0;i<vector.size()-1;i++)
{
    xxx
}

当vector为空时,即vector.size为0时,按道理应该不会进入循环,不过实际中代码会进入for语句中并且产生死循环。

我把代码作如下修改之后就不会进入for循环:

int s=vector.size()-1
for(int i=0;i<s;i++)
{
    xxx
}

后来发现原因是vector.size()返回值是无符号整型,即不能为负。减1之后将会变成一个很大的数。当size()为0时,返回值是00000000 00000000 00000000 00000000(32位,32个0),而该值减1时,由计算机组成的原理知,CPU的ALU没有减法器,只有加法器,所以变成+(-1)运算,可是-1在内存中的值为11111111 11111111 11111111 11111111(32位,32个1,补码),而一个无符号数加一个有符号数,CPU直接把它们当两个无符号数,相加的结果为11111111 11111111 11111111 11111111(32位,32个1,无符号整数),转为10进制是4294967295,所以0-1没有变成-1,而是变成了一个很大的数,因而代码看似进入了死循环。

后面的改进中,使用了int将vector返回值转为了int,所以能正常计算。

我们可以使用如下代码验证:

vector<int>num = {};
int i = num.size() - 1;
unsigned int j = num.size() - 1;
cout << i << endl;
cout << j << endl;
cout << num.size() - 1 << endl;

运行结果如下:

左边x86,右边x64。


 

发布了33 篇原创文章 · 获赞 148 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40692109/article/details/104180247