Warum gibt es int128_t nicht?

Lesezeit: 4 Minuten

Eine Reihe von Compilern bietet 128-Bit-Integer-Typen, aber keiner der von mir verwendeten bietet die typedefs int128_t. Wieso den?

Soweit ich mich erinnere ist der Standard

  • Reserven int128_t für diesen Zweck
  • Ermutigt Implementierungen, die einen solchen Typ bereitstellen, die typedef . bereitzustellen
  • Mandate, die solche Implementierungen bieten intmax_t von mindestens 128 Bit

(und ich glaube nicht, dass ich eine Implementierung verwendet habe, die tatsächlich dem letzten Punkt entspricht)

  • Der Standard schreibt das nirgends vor __int128 muss als “erweiterter Integer-Typ” behandelt werden.

    – TC

    14. April ’15 um 22:53

  • Welche Sprache verwendest du? Ich bin mir ziemlich sicher, dass der C++-Standard nicht sagt intmax_t muss mindestens 128 Bit lang sein, und ich bezweifle, dass der C-Standard dies auch tut.

    – Brian Bi

    14. April ’15 um 22:54

  • @Hurkyl: richtig, die Tatsache, dass die Implementierung ein Ding namens . bereitstellt __int128 das sich wie eine ganze Zahl verhält, bedeutet nicht, dass es “wirklich” in dem Sinne ist, dass intmax_t kümmert sich um. Auf der anderen Seite, wenn die Implementierung bereitgestellt wurde int128_t, dann intmax_t müsste mindestens so groß sein. Eine mögliche Erklärung ist also, dass die Implementierungen den Typ nicht wollen intmax_t ändern, wenn Compiler-spezifische Erweiterungen deaktiviert sind, aber ich habe keine Ahnung, ob das der wahre Grund ist oder nicht.

    – Steve Jessop

    14. April ’15 um 22:57


  • Wenn der Compiler bietet einen erweiterten Integer-Typ, dann intmax_t (oder uintmax_t, ggf.) muss diese darstellen können. Der Compiler kann aber auch einen Typ bereitstellen, der kein erweiterter Integer-Typ ist, sich aber ähnlich den Integer-Typen verhält. Und was ändern intmax_t Es wird ABI brechen, also behandelt kein Compiler wirklich __int128 als erweiterter Integer-Typ.

    – TC

    14. April ’15 um 22:59

  • @TC: Das ist schade. Meiner Meinung nach verfehlt es den Zweck von intmax_t. C-Code sollte nicht davon abhängen, dass er eine bestimmte Breite hat.

    – Keith Thompson

    14. April ’15 um 23:19

Warum gibt es int128 t nicht
Keith Thompson

Ich beziehe mich auf den C-Standard; Ich denke, der C++-Standard erbt die Regeln für <stdint.h> / <cstdint> von C.

Ich weiß, dass gcc 128-Bit-Ganzzahlen mit und ohne Vorzeichen implementiert, mit den Namen __int128 und unsigned __int128 (__int128 ist ein implementierungsdefiniertes Schlüsselwort) auf einigen Plattformen.

Selbst für eine Implementierung, die einen standardmäßigen 128-Bit-Typ bereitstellt, bietet der Standard keine erfordern int128_t oder uint128_t zu definieren. Zitieren von Abschnitt 7.20.1.1 der N1570 Entwurf der C-Norm:

Diese Typen sind optional. Wenn eine Implementierung jedoch Integer-Typen mit Breiten von 8, 16, 32 oder 64 Bit, keine Füllbits und (bei den vorzeichenbehafteten Typen) mit einer Zweierkomplement-Darstellung bereitstellt, muss sie die entsprechenden typedef-Namen definieren.

C erlaubt Implementierungen zu definieren erweiterte Integer-Typen deren Namen implementierungsdefinierte Schlüsselwörter sind. gccs __int128 und unsigned __int128 sind den vom Standard definierten erweiterten Integer-Typen sehr ähnlich — aber gcc behandelt sie nicht so. Stattdessen werden sie als Spracherweiterung behandelt.

Insbesondere wenn __int128 und unsigned __int128 war erweiterte Integer-Typen, dann müsste gcc definiert werden intmax_t und uintmax_t als diese Typen (oder als einige Typen mindestens 128 Bit breit). Es tut dies nicht; stattdessen, intmax_t und uintmax_t sind nur 64 bit.

Das ist meiner Meinung nach bedauerlich, aber ich glaube nicht, dass es gcc nicht konform macht. Kein tragbares Programm kann von der Existenz von abhängen __int128, oder auf einem ganzzahligen Typ, der breiter als 64 Bit ist. Und ändern intmax_t und uintmax_t würde ernsthafte ABI-Kompatibilitätsprobleme verursachen.

  • Um meine zwei Cent hinzuzufügen, __int128 wird erwähnt ist Nebensatz J.5.6 (Andere arithmetische Typen), daher kann es wahrscheinlich als Compiler-Erweiterung behandelt werden. Dies ist konvergent zu GCC-Dokumentation, nämlich: GCC does not support any extended integer types. .

    – Grzegorz Szpetkowski

    14. April ’15 um 23:08

  • @GrzegorzSzpetkowski: Das ist eine Umformulierung eines ähnlichen Satzes in C90: “Andere arithmetische Typen wie long long int und ihre entsprechenden Konvertierungen sind definiert”; es ist älter als C99 und die Einführung von erweiterten Integer-Typen. (Es befindet sich im Teil “Allgemeine Erweiterungen” des Anhangs “Portabilitätsprobleme”.) Ich finde es seltsam, dass sowohl der Standard als auch der gcc Erweiterungen unterstützen, die neue Ganzzahltypen hinzufügen, aber nicht den “erweiterten Ganzzahltyp”-Mechanismus verwenden.

    – Keith Thompson

    14. April ’15 um 23:15

  • Ich glaube, dass das Standardkomitee den Implementierern die Wahl ließ. Dies würde zu anderen “Lockerheiten” wie optionalen VLAs konvergieren.

    – Grzegorz Szpetkowski

    14. April ’15 um 23:24

  • Es war ein Compiler, der 128-Bit-Typen hinzufügte, zu erweitern intmax_t, dann kann Code, der diesen Typ verwendet und nach der Typerweiterung kompiliert wurde, nicht mit Code verknüpft werden, der vor der Typerweiterung kompiliert wurde. In vielen Kontexten ist es sehr wichtig, neuen Code korrekt mit älterem Code zu verknüpfen, der möglicherweise vor Jahren kompiliert wurde und für den der Quellcode möglicherweise nicht immer verfügbar ist.

    – Superkatze

    26. April ’16 um 18:19

  • @supercat: Es ist auch wichtig, die Anforderungen des Standards zu befolgen, der sagt was intmax_t ist.

    – Keith Thompson

    26. April ’16 um 18:27

.

478360cookie-checkWarum gibt es int128_t nicht?

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

Privacy policy