为什么输出进入无限循环

时间:2018-03-13 15:34:35

标签: c++ for-loop int

如果我使用nounce = 32766它只提供1次输出但是对于32767它会进入无限循环.....为什么?当我使用int

时会发生同样的事情
#include<iostream>
using namespace std;

class Mining
{
    short int Nounce;
};

int main() 
{
    Mining Mine;
    Mine.Nounce = 32767;

    for (short int i = 0; i <= Mine.Nounce; i++)
    {
        if (i == Mine.Nounce)
        {
            cout << " Nounce is " << i << endl;
        }
    }
    return 0;
}

4 个答案:

答案 0 :(得分:1)

当你使用尽可能大的正值时,每个其他值都为<=,所以这个循环会永远持续下去:

for(short int i=0;i<=Mine.Nounce;i++)

您可以使用short看到32767是您平台上numeric_limits的最大值:

std::cout << std::numeric_limits<short>::max() << std::endl; //32767 

i达到32767时,i++会尝试递增它。由于有符号溢出,这是未定义的行为,但大多数实现(如您自己显然)将简单地翻转到最大负值,然后i++将愉快地再次增加。

答案 1 :(得分:1)

数字类型对它们可以表示的值范围有限制。似乎int short可以在您的平台上存储的最大值为32767。因此,i <= 32767必定属实,在您的平台上不存在大于int short的{​​{1}}。这也是当您尝试将32767分配给100000时编译器抱怨的原因,它不能代表该值。请参阅std::numeric_limits以了解您的平台的限制。

增加已具有最大可表示值的有符号整数变量是未定义的行为。您的循环最终会在Mine.Nounce时尝试执行i++,这将导致未定义的行为。

考虑使用更大的整数类型。大多数平台上i == 32767至少为32位,这样可以表示最多int的值。您还可以考虑使用2147483647,在您的平台上,unsigned short可能会代表最高65535的值。

答案 2 :(得分:0)

for循环中,i永远不会超过Mine.Nounce的值,因为short在内存中的表示方式。大多数实现使用2个字节用于short,其中一个位用于符号位。因此,signed short可以表示的最大值是2 ^ 15 - 1 = 32767。

答案 3 :(得分:0)

它进入无限循环,因为由于有符号整数溢出,程序显示undefined behavior。 类型i的变量short在之后溢出,达到Mine.Nounce的值32767short可能是max value {{ 1}}可以坚持你的实现。你应该改变你的条件:

i < Mine.Nounce

将保持i的价值。