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)およびをチェックして、64 ビット型であるsizeof(long long)という仮定が正しいかどうかを確認してください。long

Mac OS X 10.6.1 で Xcode 3.2.1 を使用してプログラムを試してみましたが、その警告は表示されませんでした。ターゲット構成を「標準の32/64ビットユニバーサル」ではなく「32ビットユニバーサル」に設定することで、なんとか警告を受け取ることができました。正しいマシン タイプ用にビルドしていることを確認してください。

于 2009-10-23T21:01:06.970 に答える
2

ビルド設定で「アーキテクチャ」にチェックを入れます。これが「標準 (32/64 ビット ユニバーサル)」の場合、32 ビット バージョンと 64 ビット バージョンのユニバーサル バイナリがビルドされます。警告は 32 ビット ビルド用です。

あなたが見ている違いは、デバッグ構成ではチェックされているが、リリース構成ではチェックされていない「アクティブなアーキテクチャのみをビルドする」ことによるものです。そのため、64 ビットでデバッグ用にコンパイルすると、32 ビット バージョンはビルドされないため、警告は表示されません。

于 2009-10-23T21:11:35.230 に答える
0

ここでの問題は、long が 64 ビットではなく 32 ビットであることです。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 に答える