long long int vs. long int vs. int64_t in C
Betrachten Sie das folgende C-Programm:
<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>
Bei 32-Bit-GCC- und 32/64-Bit-MSVC-Kompilierungen lautet die Ausgabe des Programms:
int: 0 int64_t: 1 long int: 0 long long int: 1
Bei einer 64-Bit-GCC-Kompilierung ändert sich die Ausgabe jedoch zu:
int: 0 int64_t: 1 long int: 1 long long int: 0
Dieses Verhalten entsteht, weil in 64-Bit-Kompilierungen int64_t als long int und nicht als long long int definiert ist. Um dies zu beheben, können wir plattformspezifische Prüfungen wie folgt verwenden:
<code class="cpp">#if defined(__GNUC__) && (__WORDSIZE == 64) template <> bool is_int64<long long int>() { return true; } #endif</code>
Diese Lösung ist jedoch nicht ideal, da sie auf bestimmten Compiler- und Plattformkombinationen basiert. Eine zuverlässigere Methode wäre, dem Compiler explizit die Typäquivalenz anzugeben. Leider bietet C keine Möglichkeit, eine solche Äquivalenz zwischen grundlegenden Datentypen zu definieren. Stattdessen können wir uns auf Typmerkmale wie std::is_same verlassen. Zum Beispiel:
<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>
In diesem Beispiel wird std::is_same verwendet, um zu bestimmen, ob x und y denselben Typ haben, unabhängig von ihrer zugrunde liegenden Darstellung.
Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich das Verhalten von „int64_t', „long int' und „long long int' bei 32-Bit- und 64-Bit-Compilern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!