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.
fonte
2015-04-14 23:02:46
Quale piattaforma sei? (x86-64?) – Cameron
Lo standard da nessuna parte impone che '__int128' debba essere trattato come un" tipo intero esteso ". –
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