Un certain nombre de compilateurs fournissent des types entiers de 128 bits, mais aucun de ceux que j'ai utilisés ne fournit les typedefs int128_t
. Pourquoi?
Pour autant que je me souvienne, la norme
int128_t
dans ce butintmax_t
d'au moins 128 bits(et je ne pense pas avoir utilisé une implémentation qui soit conforme à ce dernier point)
Je ferai référence à la norme C; Je pense que la norme C++ hérite des règles pour <stdint.h>
/<cstdint>
de C.
Je sais que gcc implémente des entiers signés et non signés 128 bits, avec les noms __int128
et unsigned __int128
(__int128
est un mot clé défini par l'implémentation) sur certaines plates-formes.
Même pour une implémentation qui fournit un type standard à 128 bits, la norme n'exige pas int128_t
ou uint128_t
à définir. Citant la section 7.20.1.1 du projet N157 de la norme C:
Ces types sont facultatifs. Cependant, si une implémentation fournit des types entiers avec des largeurs de 8, 16, 32 ou 64 bits, pas de bits de remplissage et (pour les types signés) qui ont une représentation de complément à deux, elle doit définir les noms de typedef correspondants.
C permet aux implémentations de définir des types entiers étendus dont les noms sont des mots-clés définis par l'implémentation. gcc's __int128
et unsigned __int128
sont très similaires aux types entiers étendus définis par la norme - mais gcc ne les traite pas de cette façon. Au lieu de cela, il les traite comme une extension de langue.
En particulier, si __int128
et unsigned __int128
étaient des types entiers étendus , alors gcc devrait définir intmax_t
et uintmax_t
comme ces types (ou comme certains types d'au moins 128 bits de large). Il ne le fait pas; au lieu, intmax_t
et uintmax_t
ne sont que 64 bits.
C'est, à mon avis, regrettable, mais je ne pense pas que cela rende gcc non conforme. Aucun programme portable ne peut dépendre de l'existence de __int128
, ou sur tout type entier supérieur à 64 bits.