所以我有一个数字计数器:
`int count = 1;
int value = 3879418911067976105;
while (value != 0)
{
value /= 10;
count++;
}`
它产生一个无限循环。当我将count更改为0时,最大值计数达到9.我对C很新,有人可以解释为什么会这样吗?
答案 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有效,因为没有溢出,但是对于较大的数字,您仍可能遇到相同的问题。
我希望它有所帮助。