无符号长长 int in 循环的奇怪行为

strange behavior of unsigned long long int in loop

本文关键字:循环 int in 无符号      更新时间:2023-10-16

在hackerrank上解决这个问题时,我注意到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

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

当变量无符号时,i >= 0始终为真。所以你的循环永远不会结束。当我到达 0 时,下一个 -- 使i0xFFFFFFFFFFFFFFFF(十进制 18446744073709551615)。

由于无符号类型不能为负数,因此尝试将它们设置为负值将使它们环绕并保留std::numeric_limits<T>::max() - abs(value) + 1,其中T是类型,并将值value0以下。

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

顾名思义的无符号数字不采用有符号值。所以当 i = -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;
}
}