gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:18:11 26 4
gpt4 key购买 nike

我在 Netbeans C/C++ 中遇到过这种奇怪的情况。这是情况:在我的项目资源管理器中,在源文件下,我有 main.c 和 problem3.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。

最佳答案

这实际上是溢出,因为 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;
}

您应该能够安全地移动此函数,因为它现在已被明确定义。

关于c++ - Netbeans C/C++ 项目中的代码相同但输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19898683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com