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 syntaxe 0xffffffffffffffffui64, donc 0x800000000000000ui64 devrait fonctionner. Cependant, il est une version plus récente, peut-être que cela n'a pas fonctionné dans Visual Studio 2008.
  • U peut être unsigned int, unsigned long int, ou unsigned long long int pour un hex constante entière. UL peut être unsigned long int ou unsigned 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
InformationsquelleAutor franji1 | 2010-05-14