【c++】无符号类型与负数的比较
博主在学习中,发现这样一个问题:
#include<iostream>
using namespace std;
int main()
{
unsigned uint = 10;
if(uint>-1)
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
return 0;
}
如上这段代码,比较一个无符号数 10 和一个负数 -1 ,最后的输出结果却是:
no
10 > -1 是很显然的事,但是在程序中无符号数和有符号的负数之间进行比较时却出现了问题。
这是什么原因呢?
再来看看如下这段代码:
#include <iostream>
using namespace std;
int main()
{
int i = -1;
//将负值转换成无符号类型
unsigned uint = i;
cout << uint << endl;
return 0;
}
这段代码将一个负数 i 隐式地转换为 无符号类型 uint,下面看看输出结果为:
4294967295
会发现,当一个负数转化为一个无符号数的时候,这个数反而变成了一个非常大的正数。
所以,当无符号数与负数进行比较时,负数会被转化成无符号类型(比较大的),所以产生了 10<-1 的情况。
为什么是 “4294967295” ?
2 的 32次方 = 4294967296,所以 uint 实际上是 2 的 32次方 -1;
如果将 i 的值改为 -100,那么输出结果会变成 4294967196 ,也就是 2^32-100 ;
所以如果 一个负数值为 -N ,那么它转化为无符号数的值就是 2^32-N 。
举一反三
因此在做有关于无符号数据的比较时,都应该注意这个问题。
无符号的数据还有很多,很容易被忽略:
size_t类型数据如:
sizeof()的返回值
strlen()的返回值
string.size()的值
STL中的size函数等等
…………