unsigned:unsigned int 的缩写。无符号类型,取值范围为 0 ~ (2^32-1)。需要注意:
- 定义unsigned变量时需要保证为正数。
- unsigned int 变量和int 变量在一起运算或比较时,会将int型转换为unsigned int型(算术运算的隐式转换)。
- 超过unsigned范围时,会从范围的另一端取值(补码)。
由于上面三个特性的存在,衍生出很多问题:
1、unsigned int型和int 型比较大小
int -6会被转为 unsigned类型,unsigned -6 超过unsigned范围,会变为2^32 - 6,一个很大的正数。结果会输出 unsigned 5 < -6。
unsigned int a = 5;
if(a < -6){
cout << "unsigned 5 < -6" << endl;
}
2、unsigned int型和int 型相加
第一个结果会输出 a+b > 0。
此时将a+b又赋值给w转回为int型,第二个结果输出 w<0, w = -20。
int a = -30;
unsigned int b = 10;
if( a + b > 0){
cout << "a+b > 0" << endl;
}
int w = a+b;
if(w < 0){
cout << "w < 0, w = " << w << endl;
}
3、和为0
注意当 int a = -10,unsigned int b = 10。或 int a = 10,unsigned int b = -10。输出 a + b = 0。
int a = -10;
unsigned int b = 10;
if(a+b > 0){
cout << "a+b>0" << endl;
}
if(a+b <0){
cout << "a+b<0" << endl;
}
if(a+b == 0){
cout << "a+b=0" << endl; //输出这句话
}
4、string.size()和负数比较大小,string.size()返回无符号正数,输出s.size() < -1。
vector.size()与-1比较时同样,vector的size是无符号整型,有符号整型被自动转化为无符号整型,出现负数大于size的情况。
string s;
if(s.size() < -1){
cout << "s.size() < -1" << endl;
}
5、这种情况的出现主要是涉及到了隐式转换,不同类型的数据进行操作时,算术运算中的低类型会转换为高类型。
-
若两整型分别为有符号和无符号,若无符号级别高,则无符号;否则,若有符号表示范围大,则有符号;否则,都转为有符号类型的无符号版本。