无符号长长 int in 循环的奇怪行为
strange behavior of unsigned long long int in loop
在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 int
in for 循环以初始化变量i
时。变量i
使用18446744073709551615
初始化。为什么会这样?
当变量无符号时,i >= 0
始终为真。所以你的循环永远不会结束。当我到达 0 时,下一个 -- 使i
0xFFFFFFFFFFFFFFFF(十进制 18446744073709551615)。
由于无符号类型不能为负数,因此尝试将它们设置为负值将使它们环绕并保留std::numeric_limits<T>::max() - abs(value) + 1
,其中T
是类型,并将值value
0
以下。
在你的循环中,一旦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;
}
}
相关文章:
- 为什么我无法更改"set<set>"循环中的值<int>
- C++程序在循环后给出奇怪的int值
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 超出 int 的值范围后的无限循环
- 如何制作不允许重复值的 C++ int 数组循环?
- 如何在没有循环的C++中总结向量 int 的向量
- for 循环说 - 错误 成员引用基类型"int [13]"不是结构或联合
- 利用输入文件中的数据(字符串和int)并在循环中利用
- 当我输入一个字母时,cin 输入(输入是一个 int),而不是打印错误一次,它打印正确一次,然后在循环的其余部分打印 i
- 优先级队列(使用 pairs<int,int> ) 根据 for 循环迭代器的顶级元素
- 无符号长长 int in 循环的奇怪行为
- 如何在 while 循环C++中检查 int 输入是否为空或用户按 Enter 键
- 如何使用 int 参数循环访问模板函数
- for循环后,int值正在自行变化
- 在循环中设置指向 int 值的指针
- 将字符放入 int 变量中以停止循环
- 使用for循环int声明打开多个文件
- C++For循环.Int.值的求和不正确