出现溢出错误,不明白为什么
Getting an overflow error and don't understand why
当我编译下面的代码时,我得到一个错误 "warning: overflow in implicit constant conversion"。当我 运行 编译后的代码时,我得到一个不正确的结果 0。这是为什么,我该如何解决?
#include<stdio.h>
int main(void)
{
long bigboy = 600851475143;
int num_of_factors = 0;
for(int i = 1; i < bigboy; i++)
{
if(bigboy % i == 0)
num_of_factors++;
}
printf("%d", num_of_factors);
return 0;
}
I get an incorrect result, of 0. Why is this (?)
整数数学不够宽。
需要 2+ 次更改
long
够宽吗?
long
可能只有32位,那么long bigboy = 600851475143;
不足以保存常量。推荐 long long
long long bigboy = 600851475143;
int i
够宽吗?
int i
更可能是宽度不够。 int
,一般是32位的,可能只有16位的。如果 int
达到最大值,接下来的 i++
是 未定义的行为 。
// for(int i = 1; i < bigboy; i++)
for(long long i = 1; i < bigboy; i++)
int num_of_factors
够宽吗?
为什么对整数数学这么吝啬?建议全程使用long long
。
// /int num_of_factors = 0;
int num_of_factors = 0;
性能提升
与其数到 bigboy
,不如算出 bigboy
的平方根如何?
long long num_of_factors = 0;
long long i;
for(i = 1; i < bigboy/i; i++) {
if(bigboy % i == 0) {
num_of_factors += 2; // Count both i and bigboy/i
}
}
// Look for square root
if (i <= bigboy/i) {
if(bigboy % i == 0) {
num_of_factors ++;
}
}
当我编译下面的代码时,我得到一个错误 "warning: overflow in implicit constant conversion"。当我 运行 编译后的代码时,我得到一个不正确的结果 0。这是为什么,我该如何解决?
#include<stdio.h>
int main(void)
{
long bigboy = 600851475143;
int num_of_factors = 0;
for(int i = 1; i < bigboy; i++)
{
if(bigboy % i == 0)
num_of_factors++;
}
printf("%d", num_of_factors);
return 0;
}
I get an incorrect result, of 0. Why is this (?)
整数数学不够宽。
需要 2+ 次更改
long
够宽吗?
long
可能只有32位,那么long bigboy = 600851475143;
不足以保存常量。推荐 long long
long long bigboy = 600851475143;
int i
够宽吗?
int i
更可能是宽度不够。 int
,一般是32位的,可能只有16位的。如果 int
达到最大值,接下来的 i++
是 未定义的行为 。
// for(int i = 1; i < bigboy; i++)
for(long long i = 1; i < bigboy; i++)
int num_of_factors
够宽吗?
为什么对整数数学这么吝啬?建议全程使用long long
。
// /int num_of_factors = 0;
int num_of_factors = 0;
性能提升
与其数到 bigboy
,不如算出 bigboy
的平方根如何?
long long num_of_factors = 0;
long long i;
for(i = 1; i < bigboy/i; i++) {
if(bigboy % i == 0) {
num_of_factors += 2; // Count both i and bigboy/i
}
}
// Look for square root
if (i <= bigboy/i) {
if(bigboy % i == 0) {
num_of_factors ++;
}
}