C中的数字计数器无限循环

时间:2015-09-22 23:59:58

标签: c

所以我有一个数字计数器:

`int count = 1;
 int value = 3879418911067976105;
 while (value != 0)
 {
     value /= 10;
     count++;
 }`

它产生一个无限循环。当我将count更改为0时,最大值计数达到9.我对C很新,有人可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:6)

首先,您的value变量太大而且溢出。您可以通过运行此代码来检查它可以拥有的最大值:

#include <limits.h>

int main() {
    printf("INTMAX = %d\n", INT_MAX);
    return 0;
}

(有关此主题的更多信息here) 在典型的32位计算机上,这将输出INTMAX = 2147483647。这意味着你的号码实际上是默默地转换为287551913。

除此之外,我没有看到更改count的初始值会如何影响循环的终止。我会说你的代码正在做其他事情,你没有展示,而且这是负责任的。这里的代码在ideone.com上运行正常:

#include <stdio.h>
#include <limits.h>

int main(void) {
    int count = 0;
    int value = 3879418911067976105;

    printf("INTMAX = %d\n", INT_MAX);
    while (value != 0)
    {
        printf("value = %d\n", value);
        value /= 10;
        count++;
    }
    printf("count = %d\n", count);
    return 0;
}

答案 1 :(得分:4)

你的代码有几个问题。首先,int的数字太长了。您需要使用long long int。其次,您需要初始化count = 0,否则您将被一个人关闭。以下代码对我有用:

int count = 0;
long long int value = 3879418911067976105;
while (value != 0)
{
    value /= 10;
    printf("Value = %lld\n", value);
    count++;
}
printf("Count = %d\n", count);

并产生以下输出(我添加了printfs,因此更容易看到发生了什么):

Value = 387941891106797610 
Value = 38794189110679761 
Value = 3879418911067976 
Value = 387941891106797 
Value = 38794189110679 
Value = 3879418911067 
Value = 387941891106 
Value = 38794189110 
Value = 3879418911 
Value = 387941891 
Value = 38794189 
Value = 3879418 
Value = 387941 
Value = 38794
Value = 3879 
Value = 387 
Value = 38 
Value = 3 
Value = 0 
Count = 19

答案 2 :(得分:1)

问题是你导致int变量值溢出。因此,C只使用可以存储到int类型变量中的位序列部分对值进行隐式转换。

当我执行你的代码时,最初存储的值是287551913.因此,10(或9,如果你从0开始)是正确的答案。

建议的解决方案,将值更改为LL有效,因为没有溢出,但是对于较大的数字,您仍可能遇到相同的问题。

我希望它有所帮助。