我在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。
答案 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;
}
您应该可以安全地移动此功能,因为它现在已经很好地定义了。