0

我在 Netbeans C/C++ 中遇到了这种奇怪的情况。情况如下:在我的项目资源管理器中,在 Source Files 下,我有 main.c 和 question3.c

在 main.c

    #include <stdio.h>
    #include <stdlib.h>

    // long BigNumber(){
        // return 600851475143;
    // }


    int main(int argc, char* argv[]) {
        printf("%lu", BigNumber() );

        return (EXIT_SUCESS);
    }

在问题3.c

     long BigNumber(){
         return 600851475143;
     }

我的情况是,当我使用 problem3.c 中的 BigNumber() 时,它会输出403282979527,这是不正确的。但是如果我使用 main.c 中的 BigNumber(),它将打印600851475143.

谁能解释背后的魔力?是因为平台,还是工具之类的make?我正在使用 Windows 7 32 位、NetBeans 7.3.1 和 MinGW。

4

1 回答 1

1

这实际上是溢出的,因为 Windows 32 位遵循 LP32 或 4/4/4 模型,其中 int、long 和指针都是 32 位(4 字节)长,并且您存储的数字大于 32 位,有符号或不是。它在第一种情况下完全有效的事实实际上只是一个巧合。可能由于将其移动到另一个文件而导致的链接步骤“带出”了一些导致您看到的问题的其他行为。gcc 甚至在这里警告溢出。

您有几个选择,但一个简单的选择是使用int64_t而不是long(这就是所有这些intxx_t类型毕竟存在的原因!)。您还应该在文字上使用 LL 后缀来通知编译器它是long long文字,并且还将您的 printf 更改为使用"llu"而不是"lu"(long long再次)

完全修复:

#include <stdio.h>
#include <stdlib.h>

int64_t BigNumber() {
    return 600851475143LL;
}

int main(int argc, char* argv[]) {
    printf("%llu", BigNumber() );
    return 0;
}

您应该能够安全地移动这个函数,因为它现在已经很好地定义了。

于 2013-11-11T04:46:54.247 回答