Heim Backend-Entwicklung C++ Warum verhält sich „int64_t' bei 64-Bit-GCC-Kompilierungen anders?

Warum verhält sich „int64_t' bei 64-Bit-GCC-Kompilierungen anders?

Oct 30, 2024 pm 07:19 PM

Why Does `int64_t` Behave Differently in 64-bit GCC Compiles?

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

C-Typ-Merkmale können eigenartiges Verhalten zeigen, insbesondere bei vorzeichenbehafteten 64-Bit-Versionen Integer-Typen. Hier erfahren Sie, warum:

Bei 32-Bit- und 64-Bit-Kompilierungen (GCC und MSVC) verhält sich das folgende Programm wie erwartet:

<code class="cpp">#include &lt;iostream&gt;
#include &lt;cstdint&gt;

template &lt;typename T&gt;
bool is_int64() { return false; }

template &lt;&gt;
bool is_int64&lt;int64_t&gt;() { return true; }

int main()
{
    std::cout &lt;&lt; &quot;int:\t&quot; &lt;&lt; is_int64&lt;int&gt;() &lt;&lt; std::endl;
    std::cout &lt;&lt; "int64_t:\t" &lt;&lt; is_int64&lt;int64_t&gt;() &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;long int:\t&quot; &lt;&lt; is_int64&lt;long int&gt;() &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;long long int:\t&quot; &lt;&lt; is_int64&lt;long long int&gt;() &lt;&lt; std::endl;

    return 0;
}</code>
Nach dem Login kopieren

Die Ausgabe zeigt korrekt an, dass int64_t , long int und long long int sind alle äquivalente 64-Bit-Ganzzahltypen.

Eine 64-Bit-GCC-Kompilierung führt jedoch zu einem anderen Ergebnis:

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

Dieses überraschende Verhalten ist darauf zurückzuführen die C-Standardbibliotheksdefinition von int64_t:

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

In einer 64-Bit-Kompilierung ist int64_t als long int und nicht als long long int definiert. Dies bedeutet, dass die Vorlagenspezialisierung is_int64(), die nach int64_t prüft, mit long int statt mit long long int übereinstimmt.

Lösung mit teilweiser Vorlagenspezialisierung:

Um dieses Problem zu beheben Problem: Sie können eine teilweise Vorlagenspezialisierung verwenden, um is_int64() explizit für long long int zu definieren:

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

Diese Lösung ist jedoch vom Compiler abhängig und kann für jeden betroffenen Typ mühsam zu implementieren sein.

Alternative Lösung mit Boost:

Boost bietet eine elegantere Lösung mit der variadic-Vorlage boost::is_same:

<code class="cpp">#include &lt;boost/type_traits/is_same.hpp&gt;

template &lt;typename T&gt;
bool is_int64_boost() { return boost::is_same&lt;T, int64_t&gt;::value; }

int main()
{
    std::cout &lt;&lt; &quot;int:\t&quot; &lt;&lt; is_int64_boost&lt;int&gt;() &lt;&lt; std::endl;
    std::cout &lt;&lt; "int64_t:\t" &lt;&lt; is_int64_boost&lt;int64_t&gt;() &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;long int:\t&quot; &lt;&lt; is_int64_boost&lt;long int&gt;() &lt;&lt; std::endl;
    std::cout &lt;&lt; "long long int:\t" &lt;&lt; is_int64_boost&lt;long long int&gt;() &lt;&lt; std::endl;

    return 0;
}</code>
Nach dem Login kopieren

Dieser Ansatz führt zur korrekten Identifizierung alle äquivalenten 64-Bit-Ganzzahltypen, unabhängig von ihrer genauen Darstellung in der Standardbibliothek.

Das obige ist der detaillierte Inhalt vonWarum verhält sich „int64_t' bei 64-Bit-GCC-Kompilierungen anders?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte Mar 03, 2025 pm 05:53 PM

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte

GULC: C -Bibliothek von Grund auf neu gebaut GULC: C -Bibliothek von Grund auf neu gebaut Mar 03, 2025 pm 05:46 PM

GULC: C -Bibliothek von Grund auf neu gebaut

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert? Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert? Mar 03, 2025 pm 05:52 PM

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert?

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)? Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)? Mar 12, 2025 pm 04:50 PM

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)?

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die? Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die? Mar 03, 2025 pm 05:53 PM

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die?

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher? Wo ist der Rückgabewert der C -Sprachfunktion im Speicher? Mar 03, 2025 pm 05:51 PM

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher?

eindeutiger Gebrauch und Phrasenfreigabe eindeutiger Gebrauch und Phrasenfreigabe Mar 03, 2025 pm 05:51 PM

eindeutiger Gebrauch und Phrasenfreigabe

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient? Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient? Mar 12, 2025 pm 04:52 PM

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient?

See all articles