C 循环直到2147483647才运行

C 循环直到2147483647才运行,c,C,在我的代码中,当我输入数字1和2147483647时,循环将只运行到113382。它应该从1运行到2147483647 问题链接(如果有人感兴趣): 注:我在Windows10中使用代码块 #include<stdio.h> int main() { long int L,H,t,l,h,j,k,m; while(1) { scanf("%ld %ld",&L,&H); if(L == 0 &&a

在我的代码中,当我输入数字1和2147483647时,循环将只运行到113382。它应该从1运行到2147483647

问题链接(如果有人感兴趣):

注:我在Windows10中使用代码块


#include<stdio.h>

int main()

{
    long int L,H,t,l,h,j,k,m;
    while(1)
    {
        scanf("%ld %ld",&L,&H);
        if(L == 0 && H == 0)
        {
            break;
        }
        else
        {
            if(L > H)
            {
                t = L;
                L = H;
                H = t;
            }
            long int maximum = 0,maximumindex;
            l = L;
            h = H;
            for(j = 0; L <= H;L++)
            {
                k = L;
                m = 0;
                do
                {
                    if(k % 2 != 0)
                    {
                        k = (3 * k) + 1;
                        m++;
                    }
                    else
                    {
                        k = k / 2;
                        m++;
                    }
                }
                while(k != 1);
                if(m > maximum)
                {
                    maximum = m;
                    maximumindex = L;

                }
                printf("%ld %ld\n",m,L);
            }
            printf("Between %ld and %ld, %ld generates the longest sequence of %ld values.\n",l,h,maximumindex,maximum);
        }
    }
    return 0;
}


#包括
int main()
{
长整数L,H,t,L,H,j,k,m;
而(1)
{
scanf(“%ld%ld”、&L和&H);
如果(L==0&&H==0)
{
打破
}
其他的
{
如果(L>H)
{
t=L;
L=H;
H=t;
}
long int max=0,maximumindex;
l=l;
h=h;
对于(j=0;最大值为L)
{
最大值=m;
最大指数=L;
}
printf(“%ld%ld\n”,m,L);
}
printf(“在%ld和%ld之间,%ld生成最长的%ld值序列。\n”、l、h、maximumindex、maximum);
}
}
返回0;
}

您的问题表明您的
位于32位

您最多要搜索2147483647,这是32位上的最大有符号整数

在代码中,您有:


for(j=0;L您的问题表明您的
long
位于32位

您最多要搜索2147483647,这是32位上的最大有符号整数

在代码中,您有:



for(j=0;L显然是整数溢出的行为(
2147483647+1
需要32位)在您的特定示例中,是一个无声环绕。该标准不强制要求任何特定行为:您的程序也可能崩溃,显示西班牙国歌的歌词,按照您的预期运行,…您的
long
似乎是32位的,使用
unsigned long
,您将在113382之后继续。但对于2来说还不够确定147483647,如果您在64位上有
无符号长
使用它们,那么检查
scanf
返回2以了解输入是否正确如何?您的问题记得我最近的另一个问题32位
无符号长
是不够的,在143200000之前“停止”(即使仍在运行),您需要64b整数(
uint64\u t
)引用中不清楚您不能使用更长的数字,引用只是说序列中的最大值保持在32b,这是不一样的。否则您必须修改算法以使用32b int而不溢出。问题主要涉及整数溢出的行为(
2147483647+1
需要32位)在您的特定示例中,是一个无声环绕。该标准不强制要求任何特定行为:您的程序也可能崩溃,显示西班牙国歌的歌词,按照您的预期运行,…您的
long
似乎是32位的,使用
unsigned long
,您将在113382之后继续。但对于2来说还不够确定147483647,如果您在64位上有
无符号长
使用它们,那么检查
scanf
返回2以了解输入是否正确如何?您的问题记得我最近的另一个问题32位
无符号长
是不够的,在143200000之前“停止”(即使仍在运行),您需要64b整数(
uint64\u t
)引用中不清楚您不能使用更长的数字,引用只是说序列中的最大值保持在32b,这是不同的。否则您必须修改算法以使用32b int而不溢出。问题涉及*k溢出导致未定义的行为(可能会或可能不会导致执行继续,而
L
0
——并且在OP的情况下没有)@M.M是未定义的行为,但实际上为0:-),无论如何,我更正了我的答案,谢谢。我希望-2147483648比0更常见,但无论如何我们都应该避免期望。OP在113382处经历了环路中断(显然)@M.M k是OP case的问题,当它溢出时,OP似乎得到负数,k在短时间内没有达到1。@M.M哦,是的,不是0,我在head unsigned case中,溢出会导致未定义的行为(可能会或可能不会导致执行继续,而
L
0
——而OP的情况下则没有)@M.M是未定义的行为,但实际上为0:-),无论如何,我更正了我的答案,谢谢。我希望-2147483648比0更常见,但无论如何我们都应该尽量避免期望。OP在113382处经历了环路中断(显然)@M.M k是OP case的问题,当它溢出时,似乎OP得到了负数,k在短时间内没有达到1。@M.M哦,是的,不是0,我在head unsigned case中有
for(j = 0; L <= H;L++)