如果我使用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;
}
答案 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
的值32767
,short
可能是max value {{ 1}}可以坚持你的实现。你应该改变你的条件:
i < Mine.Nounce
将保持i
的价值。