为什么输出会进入无限循环
why ouput goes to infinite loop
如果我使用 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
的价值。
- 过载'operator new'如何导致无限循环?
- C++正则表达式无限循环
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 遍历链表时的无限循环
- 循环链表:无限循环
- 比较两个字符串后卡在无限循环中
- 在做一段时间内检查字符的无限循环
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 可能的无限循环
- 超出 int 的值范围后的无限循环
- 为什么这段代码会导致无限循环?
- 在控制台上输出我从文件中读取的整数,将程序插入无限循环
- 为什么输出会进入无限循环
- 我的c ++数组值不想改变,它输出无限循环
- 为什么当用户输入除整数之外的任何内容时,我的程序会无限循环输出?C++
- C++ 无限循环读取文件创建重定向命令输出
- 无限循环heisenbug:如果我添加打印输出,它就会退出
- 统计计算器输出无限循环
- 为什么这段代码没有给出任何输出?这似乎是一个无限循环