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?
Gibt es eine 128-Bit-Ganzzahl in gcc?
MetallicPriest
-
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}_t
s 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-Bitmul
/imul
ist langsamer als 32-Bit. Auch 64bitpopcnt
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
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 bereitstelltunsigned __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