C でのlong long int 対 long int 対 int64_t
次の C プログラムを考えてみましょう。
<code class="cpp">#include <iostream> #include <cstdint> template <typename T> bool is_int64() { return false; } template <> bool is_int64<int64_t>() { return true; } int main() { std::cout << "int:\t" << is_int64<int>() << std::endl; std::cout << "int64_t:\t" << is_int64<int64_t>() << std::endl; std::cout << "long int:\t" << is_int64<long int>() << std::endl; std::cout << "long long int:\t" << is_int64<long long int>() << std::endl; return 0; }</code>
32 ビット GCC コンパイルと 32/64 ビット MSVC コンパイルの両方で、プログラムの出力は次のようになります:
int: 0 int64_t: 1 long int: 0 long long int: 1
ただし、64 ビット GCC コンパイルでは、出力は次のように変わります:
int: 0 int64_t: 1 long int: 1 long long int: 0
この現象は、64 ビット コンパイルでは int64_t がlong long int ではなくlong int として定義されているために発生します。これを修正するには、次のようにプラットフォーム固有のチェックを使用します。
<code class="cpp">#if defined(__GNUC__) && (__WORDSIZE == 64) template <> bool is_int64<long long int>() { return true; } #endif</code>
ただし、この解決策は特定のコンパイラとプラットフォームの組み合わせに依存するため、理想的ではありません。より信頼性の高い方法は、型の等価性をコンパイラに明示的に指定することです。残念ながら、C には、基本データ型間のそのような等価性を定義する方法がありません。代わりに、std::is_same などの型の特性に依存できます。例:
<code class="cpp">// C++11 template <typename T> void same_type(T, T) {} void foo() { long int x; long long int y; same_type(x, y); // Will now compile successfully }</code>
この例では、基礎となる表現に関係なく、x と y が同じ型であるかどうかを判断するために std::is_same が使用されます。
以上が32 ビット コンパイラと 64 ビット コンパイラで「int64_t」、「long int」、および「long long int」の動作が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。