【问题标题】:Digit Counter Infinite Loop in CC中的数字计数器无限循环
【发布时间】:2015-09-23 08:20:58
【问题描述】:

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

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

它会产生一个无限循环。当我将计数更改为 0 时,计数达到的最大值为 9。我对 C 还很陌生,谁能解释为什么会发生这种情况?

【问题讨论】:

    标签: c


    【解决方案1】:

    首先,您的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;
    }
    

    【讨论】:

    • 谢谢!我想我不太了解各种数据类型。这帮助我解决了这个问题以及我的项目的其余部分。
    【解决方案2】:

    您的代码有几个问题。首先,这个数字对于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
    

    【讨论】:

      【解决方案3】:

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

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

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

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 2018-04-13
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        • 1970-01-01
        相关资源
        最近更新 更多