2015-04-14 12 views
36

Un numero di compilatori fornisce tipi interi a 128 bit, ma nessuno di quelli che ho usato fornisce i typedef int128_t. Perché?Perché non c'è int128_t?

Per quanto ricordo, le serie

  • Riserve int128_t per questo scopo
  • incoraggia implementazioni che forniscono un tale tipo di fornire il typedef
  • amministrazione che tali implementazioni forniscono una intmax_t di almeno 128 bit

(e, non credo di aver utilizzato un'implementazione effettivamente conforme a quest'ultimo punto)

+0

Quale piattaforma sei? (x86-64?) – Cameron

+2

Lo standard da nessuna parte impone che '__int128' debba essere trattato come un" tipo intero esteso ". –

+1

Quale lingua stai usando? Sono abbastanza sicuro che lo standard C++ non dice che 'intmax_t' deve essere lungo almeno 128 bit, e dubito che lo standard C sia. – Brian

risposta

20

Mi riferirò allo standard C; Credo che lo standard C++ eredita le regole per <stdint.h>/<cstdint> da C.

So che gcc implementa a 128 bit con segno e numeri interi senza segno, con i nomi __int128 e unsigned __int128 (__int128 è una parola chiave definito dall'implementazione) su alcune piattaforme .

Anche per un'implementazione che fornisce un tipo a 128 bit standard, lo standard non richiedono int128_t o uint128_t da definire. Citando la sezione 7.20.1.1 della bozza dello standard C N1570

Questi tipi sono facoltativi. Tuttavia, se un'implementazione fornisce tipi interi con larghezze di 8, 16, 32 o 64 bit, nessun bit di riempimento, e (per i tipi firmati) con rappresentazione a complemento a due , definirà i corrispondenti nomi typedef.

C permette implementazioni a definite tipi interi estesi i cui nomi sono le parole chiave di implementazione definiti. gcc's __int128 e unsigned __int128 sono molto simili ai tipi interi estesi come definiti dallo standard, ma gcc non li tratta in questo modo. Invece, li tratta come un'estensione del linguaggio.

In particolare, se __int128 e unsigned __int128 erano tipi interi estesi, gcc sarebbe necessario definire intmax_t e uintmax_t cui tali tipi (o come alcuni tipi di larghezza almeno 128 bit). Non lo fa; invece, intmax_t e uintmax_t sono solo 64 bit.

Questo è, a mio avviso, sfortunato, ma non credo che faccia gcc non conforme. Nessun programma portatile può dipendere dall'esistenza di __int128 o da qualsiasi tipo intero più ampio di 64 bit.

+0

Per aggiungere i miei due centesimi, viene menzionato '__int128' è la sottocreata' J.5.6' (Altri tipi aritmetici), quindi potrebbe essere trattato come l'estensione del compilatore. Questo è convergente alla [documentazione di GCC] (https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html), ovvero: 'GCC non supporta alcun tipo di intero esteso. '. –

+0

@GrzegorzSzpetkowski: Questa è una riformulazione di una frase simile in C90: "Sono definiti altri tipi aritmetici, come long long int e le loro conversioni appropriate"; precede C99 e l'introduzione di tipi interi estesi. (È nella parte "Estensioni comuni" dell'appendice "Problemi di portabilità". Trovo strano che sia le estensioni di supporto standard e gcc che aggiungono nuovi tipi di interi, ma non utilizzino il meccanismo del "tipo intero esteso". –

+1

Credo che il comitato standard abbia lasciato la scelta agli esecutori. Ciò sarebbe convergente ad altre "sciocchezze" come i VLA opzionali. –