收到溢出错误并且不明白为什么

时间:2018-08-12 21:07:02

标签: c overflow

当我编译下面的代码时,出现错误消息“警告:隐式常量转换中的溢出”。当我运行编译后的代码时,得到的结果不正确,为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;
}

1 个答案:

答案 0 :(得分:2)

  

我得到的结果不正确,为0。为什么是这个(?)

整数数学范围不足。

需要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足够宽吗?

为什么对整数数学会st?建议始终使用long long

// /int num_of_factors = 0;
int num_of_factors = 0;

性能提升

而不是算作bigboybigboy的平方根呢?

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 ++;
  }
}