c - #define 和声明有什么区别

标签 c

#include <stdio.h>
#include <math.h>

// #define LIMIT 600851475143
int isP(long i);
void run();
// 6857
int main()
{
    //int i = 6857;
    //printf("%d\n", isP(i));
     run();
}

void run()
{
long LIMIT = 600851475143;
// 3, 5
// under 1000

long i, largest =1, temp=0;
for(i=3; i<=775147; i+=2)
{
    temp = ((LIMIT/i)*i);
if(LIMIT == temp)
    if(isP(i)==1)
            largest = i;
}
printf("%d\n",largest);
}

int isP(long i)
{
long j;
for(j=3; j<= i/2; j+=2)
    if(i == (i/j)*j)
        return 0;

return 1;

}

我刚遇到一个有趣的问题。如上所示,这段代码旨在计算LIMIT的最大质数。上面显示的程序给出了 29 的答案,这是不正确的。

奇迹般地,当我定义 LIMIT 值(而不是将其声明为 long)时,它可以给我正确的值:6857。

谁能帮我找出原因?非常感谢!

最佳答案

long 在许多平台上是一个 4 字节整数,并且会在 2,147,483,647 处溢出。例如,参见 Visual C++'s Data Type Ranges页面。

当您使用#define 时,编译器可以自由选择更合适的类型来容纳您的非常大的数字。这可以使其正常运行,并为您提供预期的答案。

但是,一般来说,我会建议明确数据类型,并尽可能选择能够正确表示数字的数据类型,而无需编译器和平台特定行为。

关于c - #define 和声明有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15253584/

相关文章:

c - 将汇编翻译成伪代码

c - 修改printf

c - scanf() 和 for 循环不合作

c - 如何在c中使用无参数的void函数返回一个值

c - PIC16F 上的 24 位移位

c - c程序中对角插入元素

c - 我的 char vector 在每个位置保存相同的值

c - O_WRONLY 未声明(首次在该函数中使用)

c++ - 如何创建一个指针数组并使用 **P 将其指向 NULL?

c - 为指向二维数组指针的指针赋值