问题引入
且看下面一段诡异的代码
1 |
|
- 执行上面的代码,会输出 “unsigned 5 < -6”
- 这看起来一点都不科学 _(:з」∠)_
敲黑板,讲重点
!!!在c++里面,如果一个表达式里面同时有 unsigned int 和 int ,执行的时候会尝试把 int 转成 unsigned int。
- 这个时候如果int的值是非负的,执行的结果当然和预期一样
- 但是如果int的值是负数,它的值就变成 int的最大值 + 原值 => 其实是C++类型转换的锅,如果是int转unsigned,就会用int的最大值对原值取模
验证一下 int 转 unsigned int 的时候编译器怎么处理的
1
2
3
4
5
6
7
8
9
10
using namespace std;
int main(){
unsigned int a = -1;
unsigned int b = -2;
cout << a << " " << b << endl;
return 0;
}执行上面的代码输出为
1
4294967295 4294967294
其中 232 - 1 = 4294967295
举几个栗子加深理解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using namespace std;
int main(){
//Example 1
u_int a = -5;
int b = 4;
if(a + b > 0){
cout << "(unsigned)-5 + 4 > 0 => and the value is: " << a + b << endl;
}
//Example 2;
string s;
if(s.size() < -1){
cout << "s.size() < -1" << endl;
}
}以上代码的输出为
1
2(unsigned)-5 + 4 > 0 => and the value is: 4294967295
s.size() < -1其中Example 1很好理解,执行 a + b 的时候,b被转成了unsigned int,变成了一个很大的正数
- 而Example 2中,string对象的size()函数返回的也是一个无符号整数,所以也存在unsigned int 和 int 在同一个表达式里混用的问题。
- 不解释 => u_int <=> unsigned int