我在Core 2 Duo上运行OS X 10.6中的Xcode。这是一个简短的程序:
#include <stdio.h>
int main () {
long a = 8589934592L;
printf("a = %li\n", a);
return 0;
}
当我从命令行(gcc -pedantic)编译它时,我没有错误或警告。当我在调试配置中在Xcode中编译它时,我没有得到任何错误或警告。当我在发布配置中的Xcode中编译它时,我收到一个警告:“隐式常量转换中的溢出”。
Longs应该是64位。程序运行正常。那么发生了什么,我该如何摆脱这种警告?
答案 0 :(得分:2)
检查sizeof(long)
和sizeof(long long)
,看看您对long
64位类型的假设是否正确。
我刚刚在Mac OS X 10.6.1上使用Xcode 3.2.1尝试了你的程序,并没有得到那个警告。我设法通过将目标配置设置为“32位通用”而不是“标准32/64位通用”来获取警告。确保您正在为正确的机器类型进行构建!
答案 1 :(得分:2)
在构建设置中,选中“架构”。如果这是“标准(32/64位通用)”,则将构建具有32位和64位版本的通用二进制文件。警告是针对32位构建的。
您看到的差异来自于在Debug配置中检查的“仅构建活动体系结构”,但未在发布配置中检查。因此,当您在64位上编译Debug时,不会构建32位版本,因此没有警告。
答案 2 :(得分:0)
这里的问题是long是32位而不是64. long long是64位。
在Mac Pro上运行10.6
#include <stdio.h>
int main() {
printf("%d.\n", sizeof(long));
printf("%d.\n", sizeof(long long));
}
输出
4.
8.