C++ unsigned int 和 int 混用的问题

问题引入

且看下面一段诡异的代码

1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;

int main(){
unsigned int a = 5;
if(a < -6){ //下面的输出语句会执行
cout << "unsigned 5 < -6" << endl;
}
}
  • 执行上面的代码,会输出 “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
    #include <iostream>
    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
    #include <iostream>
    #include <string>

    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
坚持原创技术分享,您的支持将鼓励我继续创作!