Heim  >  Artikel  >  Backend-Entwicklung  >  Warum unterscheidet sich das Verhalten von „int64_t“, „long int“ und „long long int“ bei 32-Bit- und 64-Bit-Compilern?

Warum unterscheidet sich das Verhalten von „int64_t“, „long int“ und „long long int“ bei 32-Bit- und 64-Bit-Compilern?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-30 06:39:27446Durchsuche

Why Does the Behavior of `int64_t`, `long int`, and `long long int` Differ in 32-bit and 64-bit Compilers?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn