Heim > Backend-Entwicklung > C++ > Warum verhält sich „long int' in C manchmal wie „int64_t'?

Warum verhält sich „long int' in C manchmal wie „int64_t'?

Barbara Streisand
Freigeben: 2024-10-30 22:45:18
Original
514 Leute haben es durchsucht

Why does `long int` sometimes behave like `int64_t` in C  ?

Long Long Int vs. Long Int vs. Int64_t in C

Bei der Verwendung von C-Typ-Merkmalen kann es zu eigenartigem Verhalten kommen. Betrachten Sie das folgende Programm:

<code class="c++">#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>
Nach dem Login kopieren

Bei 32-Bit-Kompilierungen ist die Ausgabe wie erwartet:

int:           0
int64_t:       1
long int:      0
long long int: 1
Nach dem Login kopieren

Bei 64-Bit-GCC-Kompilierungen ist die Ausgabe jedoch anders:

int:           0
int64_t:       1
long int:      1
long long int: 0
Nach dem Login kopieren

Dies liegt an einem Unterschied in der Definition von int64_t im 64-Bit-Modus:

<code class="c++"># if __WORDSIZE == 64
typedef long int  int64_t;
# else
__extension__
typedef long long int  int64_t;
# endif</code>
Nach dem Login kopieren

Im 64-Bit-Modus ist int64_t als long int und nicht als long long definiert int.

Um dies zu beheben, könnte man die is_int64-Vorlage für long long int spezialisieren:

<code class="c++">#if defined(__GNUC__) && (__WORDSIZE == 64)
template <>
bool is_int64<long long int>() { return true; }
#endif</code>
Nach dem Login kopieren

Dies ist jedoch eine hackige Lösung. Gibt es eine Möglichkeit, dem Compiler Typäquivalenz anzugeben?

Leider ist dies in C/C nicht möglich. Der Compiler definiert die grundlegende Äquivalenz von Datentypen und Typedefs funktionieren nur in eine Richtung.

Eine alternative Problemumgehung besteht darin, Typmerkmale zu verwenden, um die Eigenschaften von Typen zu überprüfen, anstatt sich auf ihre genauen Namen zu verlassen:

<code class="c++">template <typename T>
struct some_type_trait : boost::false_type { };

template <>
struct some_type_trait<int64_t> : boost::true_type { };

// Usage
if (some_type_trait<long int>::value) {
    // ...
}</code>
Nach dem Login kopieren

Dieser Ansatz ermöglicht die Überprüfung von Typeigenschaften, ohne Typen explizit zu vergleichen.

Das obige ist der detaillierte Inhalt vonWarum verhält sich „long int' in C manchmal wie „int64_t'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage