【发布时间】:2015-09-23 08:20:58
【问题描述】:
所以我有一个数字计数器:
`int count = 1;
int value = 3879418911067976105;
while (value != 0)
{
value /= 10;
count++;
}`
它会产生一个无限循环。当我将计数更改为 0 时,计数达到的最大值为 9。我对 C 还很陌生,谁能解释为什么会发生这种情况?
【问题讨论】:
标签: c
所以我有一个数字计数器:
`int count = 1;
int value = 3879418911067976105;
while (value != 0)
{
value /= 10;
count++;
}`
它会产生一个无限循环。当我将计数更改为 0 时,计数达到的最大值为 9。我对 C 还很陌生,谁能解释为什么会发生这种情况?
【问题讨论】:
标签: c
首先,您的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;
}
【讨论】:
您的代码有几个问题。首先,这个数字对于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
【讨论】:
问题是您导致 int 变量值溢出。因此,C 仅使用可以存储到 int 类型变量中的位序列部分对值进行隐式转换。
当我执行您的代码时,最初 ws 存储的值是 287551913。因此,正确答案是 10(或 9,如果您从 0 开始)。
建议的解决方案,将值更改为 LL 有效,因为不会溢出,但是对于较大的数字,您仍然可能遇到同样的问题。
希望对你有帮助。
【讨论】: