web-dev-qa-db-fra.com

Spécification de littéraux entiers non signés 64 bits sur des modèles de données 64 bits

Comme il existe différents types de modèles de données 64 bits (LLP64/IL32P64, LP64/I32LP64, ILP64, SILP64), quelle est la manière conforme standard de spécifier des littéraux entiers non signés 64 bits?

La spécification du suffixe ULL serait-elle suffisante? Ou est-ce que je finirais par faire interpréter le littéral comme 128 bits sur certains modèles de données?

26
Zach Saw

C et C++ n'ont pas de types de variables standard 32/64/128 bits. Un long, par exemple, sur certains systèmes est de 32 bits et 64 sur d'autres. C'est ennuyeux, mais la plupart des systèmes d'exploitation fournissent de meilleurs typedefs pour vous aider, tels que uint32, etc., vous devez donc sélectionner le type exact dont vous avez besoin.

C'est le travail d'un bon script configure: pour déterminer ce que le système fournit, tester son fonctionnement et vous aider à sélectionner le bon type pour la bonne architecture sur laquelle vous travaillez.

1
Wes Hardaker

À ma connaissance, il n'y a aucun moyen de suffixer un littéral entier à une largeur de bit spécifique; vos seules options sont l, ul, ll et ull.

Si vous êtes paranoïaque à ce sujet, vous devrez envelopper vos littéraux dans un #if vérification des tailles de long/long long.

Là encore, comme KennyTM l'a souligné ci-dessus, tant que vos littéraux sont dans la plage 64 bits et affectés à une valeur 64 bits, peu importe si le littéral lui-même est 64 ou 128 bits, ou non?

1
DevSolar

Pour la plupart, cela n'a pas d'importance. Si vous ne lui donnez pas de suffixe, le type d'un littéral entier est déterminé par sa valeur. Si le compilateur a un _ 32 bits unsigned long et un 64 bits unsigned long long, une valeur non signée trop grande pour tenir dans un unsigned long mais pas trop grand pour un unsigned long long aura le type unsigned long long.

1
Pete Becker