Est-il un cryptage de 128 bits entier dans gcc?
Je veux un cryptage de 128 bits entier parce que je veux stocker le résultat de la multiplication de deux 64 bits. Est-il une telle chose dans gcc 4.4 et au-dessus?
- Prendre un coup d'oeil: stackoverflow.com/questions/3329541/...
- Pourquoi avez-vous rouvrir ce? Le haut de réponse ici est faux, affirmant que
uint128_t
est définie, alors qu'en fait gcc fournitunsigned __int128
ou__uint128_t
. Et aujourd'hui seulement sur 64 bits cibles où 128 bits ne prend que 2 entier registres. - Je VTO que les 2 dupes énumérés ne pas répondre à la question. Mon VTO n'était pas liée à des réponses.
- ok c'est juste, mais n'était-il pas fermé comme une dup de Ne gcc 128 bits int sur amd64?? Qui ressemble à un double pour moi.
- Cette question a été fermée en raison d'2 dupes: question était plus étroit et n'est donc pas dupe de cette question - et de l'autre. Que répondre les adresses de gcc en général 4.6 et avant, mais pas cette question de près de 4,4 à partir. Certes, ces et beaucoup d'autres se rapporte à des questions similaires et sur la frontière d'être suffisamment semblables/différents
- Cette question, dit "ou" par dessus", et gcc4.6 est assez vieux à ce point. (Bien que, certes, j'ai vu des réponses de cette année avec la sortie asm gcc4.4 sur RHEL). De toute façon, stackoverflow.com/posts/16088282/timeline ne pas afficher les autres (pas?) double que c'était fermé comme. Les commentaires ont été automatiquement supprimé lorsque la dup proche est allé à travers, et la fermeture elle-même ne semble pas avoir enregistré la liste en double.
- Le haut rang (plus) les réponses ne sont pas à jour. Les OP devraient envisager la modification de la question (bump) et en acceptant @PeterCordes beaucoup plus de réponse pertinente.
- Merci Brett (et Métallique) 🙂 Il y a quelques autres int128 gcc questions sur, mais le sujet semblait besoin d'un bon canonique de réponse ici, car beaucoup d'entre eux sont marqués comme étant des doublons de ce.
Vous devez vous connecter pour publier un commentaire.
De 128 bits type integer est uniquement disponible sur les systèmes 64 bits cibles, si vous avez besoin pour vérifier la disponibilité, même si vous avez déjà détecté une récente version de GCC. Dans la théorie de la gcc pourrait soutien TImode entiers sur les machines où il faudrait 4x 32 bits registres à tenir, mais je ne pense pas qu'il existe des cas où il n'.
GCC 4.6 et plus tard a un
__int128
/unsigned __int128
définie comme un type. Utilisation#ifdef __SIZEOF_INT128__
à détecter.GCC 4.1 définir
__int128_t
et__uint128_t
dans<stdint.h>
. Sur les récentes compilateurs, c'est sans doute définie en termes de__int128
. (Vous avez encore besoin de#include <stdint.h>
si vous souhaitez utiliser le__int128_t
nom au lieu de__int128
.)J'ai testé sur le Godbolt compilateur explorer pour les premières versions de compilateurs à l'appui de chacune de ces 3 choses (sur x86-64). Godbolt seulement remonte à gcc4.1, ICC13, et clang3.0, j'ai donc utilisé <= 4.1 pour indiquer que le premier aurait été encore plus tôt.
Si vous compilez pour une architecture 32 bits, comme le BRAS, ou x86 avec
-m32
, no 128 bits type entier est pris en charge, même avec la dernière version de l'un de ces compilateurs. Si vous besoin pour détecter la prise en charge avant de l'utiliser, si c'est possible pour votre code fonctionne sans elle.Le seul directe du RPC macro que je suis au courant de détection n'est
__SIZEOF_INT128__
, mais malheureusement, certaines anciennes versions de compilateur soutenir sans la définir. (Et il n'y a pas de macro pour__uint128_t
, seul le gcc4.6 styleunsigned __int128
). Comment savoir si l' __uint128_t est définiCertaines personnes utilisent encore d'anciennes versions de compilateur comme gcc4.4 sur RHEL (red hat Enterprise Linux), ou similaire croustillant de vieux systèmes. Si vous vous souciez obsolètes versions de gcc comme ça, vous voulez probablement pour coller à
__uint128_t
. Et peut-être de détecter 64 bits en termes desizeof(int_fast32_t)
qui, pour une raison quelconque est de 8 sur 64-bit Isa. Mais pas sur ILP32 Isa comme x32 ou ILP32 AArch64, alors peut-être il suffit de cochersizeof(void*)
si__SIZEOF_INT128__
n'est pas défini.Il y a peut être quelque 64-bit Isa où gcc ne définit pas
__int128
, ou peut-être même certains de 32 bits Isa où gcc ne définir__int128
, mais je ne suis pas au courant de tout.Que des commentaires sur une autre réponse ici, la GCC internes sont des entiers TI mode. (Tetra-integer = 4x la largeur de
int
, vs DImode = double largeur vs SImode = plaineint
.) Comme le manuel de GCC souligne,__int128
est pris en charge sur les objectifs qui prennent en charge un nombre entier 128 bits mode (TImode).Fait aléatoire: ICC19
-E -dM
définit:La fonction de test est:
compilateurs qui le prennent en charge toutes les compiler de manière efficace, à
unsigned __int128
- division entière est la pire. Souvent (surtout avec des div / mod arithmétique des routines) nous savons que le quotient de rentrer dans un résultat de 64 bits, mais la C au moment de l'exécution ne peut pas l'assumer. J'ai écrit une référence "modexp' (64-bit de base, exposant, le module), à l'aide de__int128
... rapport à une version à l'aide de 64 bits intrinsèques, réciproque de la division, etc., pour un 18x speed-up! 3x ou 4x sont respectables, mais n'oubliez pas qu'il est toujours temps système de l'appel, et le [u]int128 fonctions ne peuvent pas faire de l'algorithmique des assertions que nous le pouvons!divisor > high_half_dividend
.Ah, grands entiers ne sont pas C est forte.
GCC a un
unsigned __int128
/__int128
type, à partir de la version 4.quelque chose (pas sûr ici). J'ai l'air de rappeler, toutefois, qu'il y avait un__int128_t
def avant que.Ils ne sont disponibles que sur 64 bits cibles.
(Note de l'éditeur: cette réponse utilisé pour prétendre que gcc défini
uint128_t
etint128_t
. Aucune des versions que j'ai testé sur le Godbolt compilateur explorer définir ces types sans__
, gcc4.1 de l'article 8.2 , ou clang ou de la CPI.)long long int
est de 64 bits dans chaque application que j'ai utilisé, y compris la GCC pour x86-64. Et je crois que GCC est de 128 bits int est uniquement disponible sur les plates-formes 64 bits.[]int128_t
. Je suppose que c'est possible de gcc 4.8.0 pourrait avoir.typedef int really_long __attribute__ ((mode (TI)));
. Il a travaillé pendant une longue période (sur les architectures 64 bits natif).gcc-4.1 -m64
et au-dessus du support__uint128_t
out-of-the-box, et ils prennent également en charge le typedef suivant:typedef unsigned uint128_t __attribute__ ((mode (TI)));
.Vous pouvez utiliser une bibliothèque qui s'occupe de l'arbitraire ou de grandes valeurs de précision, tels que la GNU MP Bignum Bibliothèque.