为什么这会变为负值

Why is this variably turning negative?

本文关键字:为什么      更新时间:2023-10-16

所以我的错误表明我没有访问此内存的权限。这是它的代码,我正在努力让collaz系列工作。但我的n正在变得消极,尽管它不应该。

const int number = 1000000;
//Chain Vars-------------------
int chainLength = 0;
int startingNumber = 0;
int chain = 0;
int n = 0;
//----------------------------
for (int i = 2; i <= 1000000; i++)
{
    n = i;
    chain = 0;
    while (n != 1 && n >= i)
    {
        chain++;
        if ( (n % 2) == 0)
        {
            n = n / 2;
        }
        else
        {
            n = n * 3 + 1;
        }
    }
}

for循环中,您可以执行:

for (int i = 2; i <= 1000000; i++)
{
    n = i;
    chain = 0;
    while (n != 1 && n >= i)
    {
        chain++;
        if ( (n % 2) == 0)
        {
            n = n / 2;
        }
        else
        {
            n = n * 3 + 1;
        }
    }
    //Store the chain length in cache
    cache[i] = chain + cache[n];
    //-------------------------------
    if (cache[i] > chainLength)
    {
        chainLength = cache[i];
        startingNumber = i;
    }
}

在某个点上,while (n != 1 && n >= i)最有可能以n大于1000000而结束。然后,您将越界(即[0:1000000])访问cache(当您执行cache[n]时)。

while循环之前添加std::cout << "i is " << i << std::endl;。添加CCD_ 11之后。运行程序,你会得到(几秒钟后):

...
i is 113381
n is 85036
i is 113382
n is 56691
i is 113383
n is -1812855948
Erreur de segmentation (core dumped)

给你。现在,您可以使用调试器,识别错误,修复错误(很可能是返工循环),并使其工作!;-)

提示:当n变为负值时,可能达到了int的最大值。。。然后简单地使用bug类型(如long long int或uint64_t)。然后,您很可能不会得到任何重载(除非您使number成为bug)。

C#不像C++那样管理内存。如果访问数组超出了这里的范围,您可能不会出错(或者,正如上面所评论的,您只是运气好)。我不熟悉C#。必须始终避免访问阵列—它可能具有未确定的行为(可能或不可能导致崩溃)。

就像jpo38说的:

提示:当n变为负数时,它可能达到了int的最大值。。。在while循环之前,只需使用调试器验证即可:

这就是我的问题,然后我把"int n"改为"long-longn",因为"long-leng n"仍然很小,现在它给了我正确的答案。谢谢大家:)很容易,但有时是你看不到的小事。

运行并调试程序后:

    //Store the chain length in cache
    cache[i] = chain + cache[n];

n似乎是0x93f20374(在i处为113383),其为负-1812855948,或者将是正2482111348-但溢出变为-1812855948

while (n != 1 && n >= i)

循环以负n结束,导致cache[n]崩溃。