Gibt es eine 128-Bit-Ganzzahl in gcc?

Lesezeit: 4 Minuten

Benutzeravatar von MetallicPriest
MetallicPriest

Ich möchte eine 128-Bit-Ganzzahl, weil ich Ergebnisse der Multiplikation von zwei 64-Bit-Zahlen speichern möchte. Gibt es so etwas in gcc 4.4 und höher?

  • Schau mal: http://stackoverflow.com/questions/3329541/…

    – Valeri Atamaniouk

    18. April 2013 um 16:28 Uhr

  • @chux: Warum hast du das wieder geöffnet? Die Top-Antwort hier ist falsch und behauptet das uint128_t ist definiert, wenn gcc tatsächlich bereitstellt unsigned __int128 oder __uint128_t. Und derzeit nur auf 64-Bit-Zielen, wo 128-Bit nur 2 Integer-Register benötigt.

    – Peter Cordes

    21. Februar 2019 um 18:39 Uhr

  • @PeterCordes I VTO als die 2 aufgeführten Duplikate haben die Frage nicht beantwortet. Mein VTO war mit keinen Antworten verbunden.

    – chux – Wiedereinsetzung von Monica

    22. Februar 2019 um 5:25 Uhr

  • @chux: ok, das ist fair, aber wurde es nicht als Dup von geschlossen? Unterstützt gcc 128-Bit-Int auf AMD64? Das sieht für mich nach einem Duplikat aus.

    – Peter Cordes

    22. Februar 2019 um 5:28 Uhr

  • @PeterCordes Diese Frage wurde aufgrund von 2 Duplikaten geschlossen: Die Frage war schmaler und daher kein Duplikat dieser Frage – und einer anderen. Diese Antwort befasst sich mit gcc im Allgemeinen 4.6 und früher, aber nicht mit dieser Frage ab 4.4. Sicherlich sind diese und viele andere verwandte Fragen ähnlich und an der Grenze ausreichend ähnlich/verschieden

    – chux – Wiedereinsetzung von Monica

    22. Februar 2019 um 5:38 Uhr

  • unsigned __int128 – Vollständige Teilung ist die schlechteste. Häufig (insbesondere bei div / mod-Arithmetikroutinen) wissen wir, dass der Quotient in ein 64-Bit-Ergebnis passt, aber die C-Laufzeit kann ihn nicht annehmen. Ich habe eine Referenz ‘modexp’ (64-Bit-Basis, Exponent, Modulus) geschrieben, indem ich verwendet habe __int128 … im Vergleich zu einer Version mit 64-Bit-Intrinsic, reziproke Teilungetc., für ein 18x beschleunigen! 3x oder 4x sind respektabel, aber denken Sie daran, dass es immer einen Anruf-Overhead gibt, und das [u]int128-Funktionen können nicht die algorithmischen Behauptungen aufstellen, die wir können!

    – Brett Hale

    1. Juli 2019 um 17:12 Uhr

  • @BrettHale: interessant. Die Hilfsfunktion von gcc überprüft möglicherweise nur, ob die obere Hälfte Null ist, anstatt dies (für unsigned) zu überprüfen divisor > high_half_dividend.

    – Peter Cordes

    1. Juli 2019 um 20:51 Uhr

  • Schnelle Typen sind kein guter Weg, um die Bitness einer Architektur herauszufinden. ZB Müsli {,u}int_fast{16,32}_ts auf x86_64 sind 32 Bit, glibc sind 64 (ebenfalls nicht gut in eine API aufzunehmen).

    – PSkočik

    19. Januar 2020 um 8:33 Uhr

  • @PSkocik: IDK, warum ich das überhaupt vorgeschlagen habe. Ich glaube, ich hatte gehofft, etwas zu finden, das sogar auf ILP32-ABIs wie x32 von x86-64 Linux oder AArch64 ILP32 funktionieren würde, aber das ist nicht der Fall. Ich bin froh zu hören, dass MUSL auf x86-64 32-Bit macht; das ergibt für mich mehr sinn. Ich hatte nicht bemerkt, dass es nicht von der ABI festgelegt wurde und daher nicht für die Verwendung in einer API geeignet ist.

    – Peter Cordes

    19. Januar 2020 um 9:26 Uhr

  • @PSkocik: 64-Bit-Ganzzahlen können manchmal eine Anweisung zur Vorzeichenerweiterung speichern, wenn sie als Array-Indizes verwendet werden, sind aber ansonsten streng schlechter. Große Codegröße (REX-Präfixe) und viel langsamer div auf Intel-CPUs (~2,5x). Auf AMD vor Zen, 64-Bit mul/imul ist langsamer als 32-Bit. Auch 64bit popcnt ist auf einigen CPUs langsamer. (Alle diese werden mit 32-Bit verglichen, der Standard-Operandengröße in x86-64-Maschinencode, der kostenlos auf 64-Bit erweitert wird.)

    – Peter Cordes

    19. Januar 2020 um 10:23 Uhr


  • long long int ist 64 Bit in jeder Implementierung, die ich verwendet habe, einschließlich GCC für x86-64. Und ich glaube, dass das 128-Bit-Int von GCC nur auf 64-Bit-Plattformen verfügbar ist.

    – zwischenjay

    18. April 2013 um 16:34 Uhr


  • Ich habe es gerade in 2 Systemen ausprobiert, und sie stehen zu Ihren Ergebnissen. Ich habe die Behauptung entfernt, dass es bis zu 128 Bit lang ist.

    – sležica

    18. April 2013 um 16:52 Uhr


  • gcc 4.7.2 unter Linux x86_64 nicht []int128_t. Ich nehme an, es ist möglich, dass gcc 4.8.0 es haben könnte.

    – Keith Thompson

    18. April 2013 um 17:51 Uhr

  • Versuchen typedef int really_long __attribute__ ((mode (TI)));. Es hat lange funktioniert (auf Architekturen mit nativem 64-Bit).

    – Pascal Cuoq

    18. April 2013 um 20:39 Uhr

  • gcc-4.1 -m64 und über Unterstützung __uint128_t out-of-the-box, und sie unterstützen auch die folgende Typedef: typedef unsigned uint128_t __attribute__ ((mode (TI)));.

    – Pkt

    1. Januar 2014 um 21:54 Uhr

  • Reed gab eine vollkommen gültige Antwort für Nicht-64-Bit-Maschinen. Diese Frage ist die häufigste Antwort auf eine Suche nach „C int128“, daher ist es gut, eine allgemeine Antwort für jede Plattform zu haben. Wenn Sie sich bei diesem Thema so stark fühlen, schreiben Sie vielleicht das nächste Mal eine Antwort, anstatt jemand anderen niederzureißen (auf diese Weise können Sie auch die Vorteile der Repräsentanten ernten).

    – CrazyCasta

    29. Oktober 2020 um 5:35 Uhr

  • @CrazyCasta eine Bibliothek mit beliebiger Genauigkeit nur für einen 128-Bit-Typ zu haben, ist einfach zu verschwenderisch und der Overhead ist einfach zu groß. Eine Bibliothek mit fester Breite wie Boost.Multiprecision oder calccrypto/uint128_t ist viel kleiner und schneller

    – phuklv

    12. Januar 2021 um 9:24 Uhr

1416190cookie-checkGibt es eine 128-Bit-Ganzzahl in gcc?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy