Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 循环中无符号长整型的奇怪行为_C++_Loops_C++11 - Fatal编程技术网

C++ 循环中无符号长整型的奇怪行为

C++ 循环中无符号长整型的奇怪行为,c++,loops,c++11,C++,Loops,C++11,在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; } } 输入:12

在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


现在,当我在for循环中将long-long-int更改为无符号long-long-int以初始化变量I时。变量i初始化为18446744073709551615。为什么会发生这种情况?

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

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

因为无符号类型不能为负值,尝试将它们设置为负值将使它们环绕,而不是保持std::numeric_limits::max-absvalue+1,其中t是类型,值小于0


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

因为无符号类型不能为负,尝试将其设置为负值将使其环绕,而不是保持std::numeric_limits::max-absvalue+1,其中T是类型,值小于0


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

顾名思义,无符号数不采用有符号值。所以当i=-1时,它实际上是十进制的0xFFFFFFFFFFFF18446744073709551615

您可以通过修改后的程序看到这一点

 #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;
   }
 }

顾名思义,无符号数字不接受有符号值。所以当i=-1时,它实际上是十进制的0xFFFFFFFFFFFF18446744073709551615

您可以通过修改后的程序看到这一点

 #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;
   }
 }

它不是用18446744073709551615初始化的。它被初始化为2。因为它是无符号的,在循环中循环两次之后,它被设置为一个非常大的正数。由于未签名,它永远不能为负。建议阅读:define modVal 100000007;为什么?它的首字母不是18446744073709551615。它被初始化为2。因为它是无符号的,在循环中循环两次之后,它被设置为一个非常大的正数。由于未签名,它永远不能为负。建议阅读:define modVal 100000007;为什么?平心而论,这是一个常见的错误,虽然一旦经历了它,你就会注意它,但从某种意义上说,它是相当微妙的。毕竟,你告诉你的循环不要超过0!某种程度上。但是,一个好的编译器会在i>=0时发出警告,条件总是true@hs使用IDE。@hs如果此答案解决了您的问题,您可能希望将其标记为正确答案。然后在搜索中,人们可以看到问题已经解决了。公平地说,这是一个常见的错误,尽管你曾经经历过,但从某种意义上说,它是相当微妙的。毕竟,你告诉你的循环不要超过0!某种程度上。但是,一个好的编译器会在i>=0时发出警告,条件总是true@hs使用IDE。@hs如果此答案解决了您的问题,您可能希望将其标记为正确答案。然后在搜索中,人们可以看到问题已经解决了。