Je lis la documentation et dit qu'une longue est% litre, mais l'impression est revenue sous -2147024891. Ce qui donne? p>
6 Réponses :
Vous n'avez même pas fourni quel numéro vous vouliez imprimer, mais je suppose que vous avez trébuché sur la différence entre l'impression signée et non signée. P>
Utiliser Le MSDN a une bonne documentation sur les spécificateurs de PrintF. Pour les valeurs 64 bits (comme % LU code> pour non signé long code> numéros et % ld code> ou % li code> pour signé long code> numéros. p>
long LONG LONG code>, par exemple), vous devez utiliser les macros dans . p>
imprimez-vous une valeur non signée comme signée? Avec le complément de deux, une valeur avec l'ensemble de bits le plus significatif sera imprimé comme négatif. Essayez% u pour non signé p>
"% u" est pour le type non signé INT code>. L'OP a demandé l'impression LONG code> numéros.
% LD ou% LU en fonction du "long" dont vous avez besoin. P>
Vous essayez d'imprimer un HRESULT, le code d'erreur pour "Accès refusé". Qui est mieux formaté dans Hex, au moins être facilement reconnaissable à un programmeur et à la boîte de requête Google.
printf("0x%08lx", hr);
+1 pour la belle observation. Je remarquerais que cela signifie qu'un hresult est toujours de 32 bits. Le pendentifien (puis-je dire que ce mot?) En moi veut souligner que vous devez toujours utiliser les macros de largeur fixe pour ... bien ... des entiers de largeur fixe, c'est-à-dire printf ("0x% 08" Prix32, hR); code> dans ce cas. Le fait que Microsoft semble ne pas se soucier de C99 est une question latérale que je voudrais ne pas reconnaître comme pertinente;)
L'OP est correct, HRESULT est TEPDEF-ED à long terme. Utiliser% lx n'est pas faux.
Vous avez raison. C'est Typef-ed à long, mais long est spécifiquement défini comme étant "entier signé 32 bits. La gamme est -2147483648 à 2147483647 décimale".
C'est la réponse réelle.
donné le code: La sortie compilée en mode 32 bits (sur MacOS 10.6.2) est la suivante: p> La sortie compilée en mode 64 bits est la suivante: p> puisque vous ne nous montrez pas ce que vous avez écrit et pourquoi vous avez attendu quelque chose de différent, il est difficile de dire ce qui pourrait être tort. Cependant, bien que relativement inhabituel, la conversion '% Li code>' était en C89 ainsi que C99, de sorte que cela devrait être correct. Les spécificateurs de conversion les plus normaux sont '% ld code>' (un synonyme de '% li code>') et '% LU code>' (et '% lo code> 'et' % lx code> ') pour les valeurs non signées. p> p>
Essayez % LLU code> et pour attribuer une valeur à une variable longue, n'oubliez pas que vous devez ajouter ll code> à la fin du numéro, par exemple A = 99999999999LLL code>. p>