Netbeans C / C ++项目中的代码相同但输出不同

时间:2013-11-11 04:12:34

标签: c++ c netbeans

我在Netbeans C / C ++中遇到了这种奇怪的情况。情况如下: 在我的项目资源管理器中,在Source Files下,我有main.c和problem3.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);
    }

在problem3.c中

     long BigNumber(){
         return 600851475143;
     }

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

任何人都可以解释背后的魔力吗?是因为平台还是make等工具?我正在使用Windows 7 32位NetBeans 7.3.1和MinGW。

1 个答案:

答案 0 :(得分: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;
}

您应该可以安全地移动此功能,因为它现在已经很好地定义了。