0

我在 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 中编译它时,我收到一个警告:“隐式常量转换中的溢出”。

Long 应该是 64 位的。并且程序运行良好。那么发生了什么事,我该如何摆脱这个警告?

4

3 回答 3

2

检查sizeof(long)sizeof(long long)查看您对long64 位类型的假设是否正确。

我刚刚在 Mac OS X 10.6.1 上使用 Xcode 3.2.1 试用了您的程序,但没有收到该警告。我确实设法通过将目标配置设置为“32 位通用”而不是“标准 32/64 位通用”来获得警告。确保您正在构建正确的机器类型!

于 2009-10-23T21:01:06.970 回答
2

在构建设置中,选中“架构”。如果这是“标准(32/64 位通用)”,则将构建具有 32 位和 64 位版本的通用二进制文件。警告适用于 32 位版本。

您看到的不同之处在于“仅构建活动架构”在调试配置中被选中,而不是在发布配置中。因此,当您在 64 位上编译 Debug 时,不会构建 32 位版本,因此没有警告。

于 2009-10-23T21:11:35.230 回答
0

这里的问题是 long 是 32 位的,而不是 64 位的。 long long 是 64 位的。

在运行 10.6 的 Mac Pro 上

#include <stdio.h>
int main() {
    printf("%d.\n", sizeof(long));
    printf("%d.\n", sizeof(long long));

}

输出

4.
8.
于 2009-10-23T21:04:42.797 回答