10

Windows (MinGW) および Linux (g++) 用の C++ でクロスプラットフォーム コードを記述しようとしています。Linux では 64 ビット整数を「long」と定義していましたが、MinGW に移行すると、sizeof(long) は 4 バイトを返しました。その後、「long long」または「__INT64」を使用して、MinGW で 64 ビット整数を定義できることを発見しました。2 つの質問があります。

1.-Windows と Linux の両方で 64 ビット整数を定義する最も移植性の高い方法は何ですか? 現在 #ifdef を使用していますが、これが最適な方法かどうかはわかりません。

#ifdef LINUX
    #define INT64 long 
#elif WIN32
    #define INT64 long long
#endif

2.- MinGW で「long long」または「__INT64」を使用する必要がありますか? なぜ?

4

2 に答える 2

16

int64_theader で定義されている type を使用できますcstdint。これは C++11 以降の標準です。

使用しているプラ​​ットフォームが 64 ビット整数をサポートしていない場合、この型が存在しない可能性があることに注意してください。

に関してはlong long、それは別の可能性です。long longs は少なくとも 64 ビット幅です。C++03 を使用する場合、いくつかのコンパイラで動作しますが、C++11 の時点でも標準であることに注意してください。

ピート・ベッカーが述べたように、 を使用できますint_least64_t。これは、正確に 64 ビットの整数を使用してもかまわないが、少なくとも64 ビット幅の整数型を使用する場合に適しています。

于 2013-04-09T17:43:18.677 に答える
2

64 ビット整数を取得する方法については十分に答えられたと思いますが、「long long」を使用するか「__INT64」を使用するかという 2 番目の質問に挑戦します。最初に答える必要がある質問は、必要なものです。何らかの理由で正確に 64 ビットが必要な場合は、正確に 64 ビットを提供するもの、つまり int64_t を必ず使用してください。プラットフォーム/コンパイラに stdint.h がない場合でも、回避策として適切な型として typedef を作成します (コンパイラの場合は #ifdef します)。これにより、コードがより自己文書化されます。一方、大きなメモリ セグメント (DVD イメージなど) のオフセットなどを処理する場合は、size_t または ssize_t を使用します。同様に、ファイル内のオフセットは、fpos_t を使用して最も適切に表されます。

ところで: Linux で "long" が 64 ビットであるという仮定は間違っています。特に 32 ビット バリアントでは 64 ビットではなく、実際にすべての 64 ビット バリアントが 64 ビット long を使用しているかどうかもわかりません。これらの異なるシステムは、ILP32、LP64、および LLP64 と呼ばれます。そんな言葉をネットで検索!

于 2013-04-09T20:37:28.367 に答える