2009-04-28 13 views
1

OS X 10.5.6に64ビット整数を強制しようとしています。 Apple MacBook Intel Core 2 Duoで動作します。OS Xで64ビット整数演算を強制するにはどうすればよいですか?

#include<stdio.h> 

int main() 
{ 
    long a = 2147483647; /*== 2^32 - 1*/ 
    long aplus1; 

    printf("a== %d. sizeof(a) == %d \n", a, sizeof(a)); 

    aplus1 = a+1; 

    printf("aplus1 = %d \n", aplus1); 
} 

任意のスイッチなしのコンパイル以下の収率:

$ gcc testlong.c -o testlong ;./testlong 

a== 2147483647. sizeof(a) == 4 
aplus1 = -2147483648 

-m64スイッチ収率でコンパイル:

$ gcc testlong.c -o testlong -m64; ./testlong 

a== 2147483647. sizeof(a) == 8 
aplus1 = -2147483648 

ので番目のバージョンが明らかに使用されてここに私のCコードがあります64ビットの記憶域であるが、依然としてオーバーフローエラーを生成するが、2^32は64ビット整数の範囲内にあるべきである。何か案は?

私は、複数の行のソースコードを変更する必要はなく、gccオプションを強制することができます(私の実際の問題は上記の例ではなく、もっと長い整数演算を強制する必要があります)概況)。

答えて

0

は、あなたは試してみました:

long long a = 2147483647; 
+0

すぐにお返事ありがとうございます!しかし、-m64スイッチの有無にかかわらず、動作しないようです。 – seandbarrett

3

あなたはC99を使用している場合は、stdint.hを含めるとuint64_tint64_tを使用しています。それ以外の場合は、unsigned long long a = 0x100000000ull;もうまくいくはずです。

+0

私はこれをもう一度。 印刷するには、stdint.hに定義されている 'PRI'マクロを使用できます。 printf( "a =%" PRIu64 "\ n"); – joveha

9

long longを使用するだけでなく、それに応じてprintf()ステートメントも変更する必要があります。

#include<stdio.h> 

int main() 
{ 
    long long a = 2147483647; /*== 2^32 - 1*/ 
    long long aplus1; 

    printf("a== %lld. sizeof(a) == %d \n", a, sizeof(a)); 

    aplus1 = a+1; 

    printf("aplus1 = %lld \n", aplus1); 
} 

%lldはlong longのコードです。

明らかに64ビットプログラムでは、64ビット整数に対して%dを使用できます。このモードでコンパイルできるかどうかはわかりません。

+1

実際、printf形式の仕様が問題です。 OPのシステムが32ビットのintと64ビットのlongを持つ場合、 'long long'は必要ありません。フォーマットを"%ld "に変更するだけで十分です。 – ephemient

+0

はい、エフェメレントはまさに正しいです。私の元のコードの問題はprintfステートメントにあったようです - %ldに変更すると、-m64スイッチでコンパイルすれば、 "long long"を必要とせずに問題が修正されます。 ありがとう! – seandbarrett

+6

Mac OS X 64ビットは、(int = 32、long = longlong = pointer = 64)であるLP64モデルに従います。これは最も一般的な64ビットモデルです。 Win64はLLP64を使用します(int = long = 32、longlong = pointer = 64)。 ICCはILP64モデル(int = long = longlong = pointer = 64)に従うために '-DMKL_ILP64'を受け取り、GCCは' -mint64'を同じものにしますが、ほとんどのプラットフォームでは利用できず、他のライブラリやシステムAPI 。 – ephemient

0

Cコードの2147483647は、intです。 longにしたい場合は、左側にlongが表示されません。右側にはまだintです。

'L'を付加して長いリテラルにしてください:2147483647L(大文字をお勧めします、小文字の 'l'も同様ですが、フォントによっては非常に混乱する可能性があります)。

関連する問題