Comment spécifier un 64 bits unsigned int const 0x8000000000000000 dans VS2008?
J'ai lu sur le Microsoft suffixe spécifique "i64" pour les constantes entières. Je veux faire un UNsigned passage à un ULONGLONG.
ULONGLONG bigNum64 = 0x800000000000000i64 >> myval;
En C normale, je voudrais utiliser le suffixe "U", par exemple, le semblable 32 bits serait
ULONG bigNum32 = 0x80000000U >> myval;
Je ne veux PAS les 2 en complément à l'extension du signe de propager à travers le haut bits. Je veux un UNSIGNED maj sur un 64 bits const nombre. Je pense que ma première déclaration va faire un SIGNÉ décalage à droite.
J'ai essayé 0x800000000000000i64U
et 0x800000000000000u64
, mais a eu des erreurs de compilation.
- Dans mon Visual Studio,
limits.h
a la syntaxe0xffffffffffffffffui64
, donc0x800000000000000ui64
devrait fonctionner. Cependant, il est une version plus récente, peut-être que cela n'a pas fonctionné dans Visual Studio 2008. U
peut êtreunsigned int
,unsigned long int
, ouunsigned long long int
pour un hex constante entière.UL
peut êtreunsigned long int
ouunsigned long long int
. Voir 6.4.4.1 de la norme (ou 2.14.3 de la norme C++). Étant donné que, je ne pense pas que l'OP de l'exemple est incorrecte ou a besoin d'être modifié.- C'est une vieille question. En C++11, je ne pense pas que tout le suffixe est nécessaire. Seulement un entier non signé de 64 bits de type intégral peut maintenir cette constante. Un unsigned long long doit être d'au moins 64 bits, et c'est sur la liste des types le compilateur doit essayer pour un littéral au format hexadécimal. en.cppreference.com/w/cpp/language/integer_literal
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le suffixe
ull
, qui est la norme C99 et C++0x) de spécifier ununsigned long long
littéral entier, et unlong long
est au moins 64 bits.-Wlong-long
peut être désactivée sur le compilateur de ligne de commande ou dans le code avec#pragma GCC diagnostic ignored "-Wlong-long"
. Voici un bel exemple de le faire à titre temporaire pour une section de code.long long
si vous compiler en C99 mode ou plus.-std=gnu99
qui est chemin pour compiler en C99 mode dans AtmelStudio. Et je reçoiswarning: use of C99 long long integer constant [-Wlong-long]
je dois activer l'alerte par défaut parce que c'est un 32-bit MCU, et je veux utiliser math 64 bits avec parcimonie.-std=c99
ne fonctionne pas. Corrigez-moi si je me trompe, mais pour moi-std=gnu99
sonne comme une préférence personnelle de la personne qui a donné cette réponse (avec certaines holywar-ish attitude, car il n'a même pas pris la peine de mentionner-std=c99
).LL
suffixes? Que-Wlong-long
ne fait rien? Ou juste que c'est désactivé par défaut.-Wlong-long
. Mais je m'attends à être désactivé par défaut.Assez drôle, mais vous n'avez pas besoin d'ajouter un suffixe à votre hex constant pour être traités correctement. Section 6.4.4.1 de la norme et à l'article 2.14.3 de la norme C++ contient le tableau suivant:
Ce tableau nous indique quel est le type d'une constante entière aura. La constante entière de type sera le premier type dont la valeur est adaptée.
Cela signifie que le compilateur va itérer sur les types suivants pour la constante hexadécimale
0x800000000000000
(il n'a pas de suffixe, de sorte qu'il utilise le "non" de ligne, et c'est un hex constante, de sorte qu'il utilise la "Constante Hexadécimale" colonne), et il utilise le premier type qui peut stocker cette valeur*:int
: Non, un entier signé 32 bits ne peuvent pas stocker cette valeur.unsigned int
: Non, non signé de 32 bits entier ne peut pas stocker cette valeur.long int
: Non, un entier signé 32 bits ne peuvent pas stocker cette valeur.unsigned long int
: Non, non signé de 32 bits entier ne peut pas stocker cette valeur.long long int
: Non, un 64-bits entier signé ne peut pas stocker cette valeur.unsigned long long int
: Oui, un 64-bit unsigned integer peut stocker cette valeur. Puisque c'est le premier type capable de stocker de la valeur, c'est le type de la constante entière aura.Donc pour répondre à ta question de "Comment écrire et utiliser la valeur
0x800000000000000
et assurez-vous que le compilateur ne pas traiter la haute peu comme un bit de signe?": Il suffit juste d'écrireunsigned long long value = 0x800000000000000
.Si vous voulez faire un peu de bit-à-bit de l'arithmétique, de la valeur, vous pouvez simplement aller de l'avant et de le faire (c'est à dire il suffit d'écrire
0x800000000000000 >> myval
). Vous avez la garantie qu'il ne sera pas traitée comme une débordé entier signé, et votre maj de droite ne pourra pas faire l'extension du signe parce que c'est une valeur positive.*je suis en supposant que
int
32-bits,long
32-bits, etlong long
est 64-bits. Notez que votre compilateur peut utiliser différents bits tailles pour ces types, qui peuvent changer le résultat final (bien que le processus reste le même).printf("%lx\n", (0x40000000<<1)>>1);
La gauche/droite du poste de redonner 0x40000000, mais si vous exécutez ce code, vous obtiendrez 0xc0000000.