web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas int128_t?

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

  • Réserves int128_t dans ce but
  • Encourage les implémentations qui fournissent un tel type à fournir le typedef
  • Exige que ces implémentations fournissent un intmax_t d'au moins 128 bits

(et je ne pense pas avoir utilisé une implémentation qui soit conforme à ce dernier point)

43
Hurkyl

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.

24
Keith Thompson