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

Tan Jia Ming

我在Netbeans C / C ++中遇到了这种奇怪的情况。情况如下:在我的项目浏览器中,在“源文件”下,我有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);
    }

在问题3.c中

     long BigNumber(){
         return 600851475143;
     }

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

谁能解释其背后的魔力?是因为平台还是诸如之类的工具make我正在将Windows 7 32位NetBeans 7.3.1与MinGW结合使用。

萨姆·克里斯塔尔(Sam Cristall)

这实际上是溢出的,因为Windows 32位遵循LP32或4/4/4模型,其中int,long和pointer都是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;
}

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章