我在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结合使用。
这实际上是溢出的,因为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] 删除。
我来说两句