unsigned long long int在循环中的奇怪行为

时间:2019-06-25 10:20:17

标签: c++ loops c++11

在解决hackerrank上的this问题时,我注意到for循环中发生了一件奇怪的事情。首先,让我展示一个示例代码:

#include <bits/stdc++.h>
using namespace std;
#define modVal 1000000007;

int main() {
    for(long long int i=2;i>=0;--i){
        cout<<"here: "<<i<<endl;
    }
}
  

输入:123

     

输出:此处:2   在这里:1   这里:0   164

现在,当我在for循环中将long long int更改为unsigned long long int以初始化变量i时。变量i18446744073709551615初始化。为什么会这样?

3 个答案:

答案 0 :(得分:6)

当变量为无符号时,i >= 0始终为true。因此,循环永远不会结束。当我达到0时,下一个-使i为0xFFFFFFFFFFFFFFFF(十进制18446744073709551615)。

答案 1 :(得分:3)

由于无符号类型不能为负,因此尝试将它们设置为负值将使它们回绕,而是使用std::numeric_limits<T>::max() - abs(value) + 1,其中T是类型,而value是值低于0

在循环中,一旦i达到0,条件i >= 0仍会满足,因此它将递减为-1,但是对于如上所述的无符号类型是不可能的因此循环永远不会退出。

答案 2 :(得分:3)

顾名思义,无符号数字不采用带符号的值。因此,当我= -1时,它实际上是0xFFFFFFFFFFFFFFFF(十进制18446744073709551615)。

您可以在修改后的程序中看到自己。

 #include <bits/stdc++.h>
 using namespace std;
 #define modVal 1000000007;

 int main() {
    for(unsigned long long int i=2;i>=0;--i){
         cout<<"here: "<<i<<endl;
       if(i > 3)
          return 0;
   }
 }