为什么输出会进入无限循环

why ouput goes to infinite loop

本文关键字:无限循环 输出 为什么      更新时间:2023-10-16

如果我使用 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;
}

当您使用最大可能的正值时,所有其他值都将<=到它,因此此循环将永远持续下去:

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

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

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

i达到 32767 时,i++将尝试递增它。由于签名溢出,这是未定义的行为,但是大多数实现(显然像您自己的实现(将简单地滚动到最大负值,然后i++会很高兴地再次递增。

数值类型对它们可以表示的值范围有限制。似乎int short可以在您的平台上存储的最大价值是 32767 .因此,i <= 32767一定是正确的,但在您的平台上不存在大于32767 int short。这也是为什么编译器在尝试将100000分配给Mine.Nounce时会抱怨的原因,它无法表示该值。请参阅 std::numeric_limits 以了解您的平台的限制。

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

请考虑使用较大的整数类型。 int在大多数平台上至少是 32 位,这将允许它表示高达 2147483647 的值。您还可以考虑使用在您的平台上可能能够表示高达 65535 的值unsigned short

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

它进入无限循环,因为程序由于有符号整数溢出而表现出未定义的行为。类型 short 的变量i在达到 Mine.Nounce 的值(32767这可能是short可以实现的最大值后溢出。您应该将条件更改为:

i < Mine.Nounce

这将保持i的价值。