6
votes

Comment puis-je imprimer une longue? Cela ne devrait-il pas fonctionner? % li

Je lis la documentation et dit qu'une longue est% litre, mais l'impression est revenue sous -2147024891. Ce qui donne?


0 commentaires

6 Réponses :


14
votes

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.

Utiliser % LU pour non signé long numéros et % ld ou % li pour signé long numéros.

Le MSDN a une bonne documentation sur les spécificateurs de PrintF. Pour les valeurs 64 bits (comme long LONG LONG , par exemple), vous devez utiliser les macros dans .


0 commentaires

0
votes

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é


1 commentaires

"% u" est pour le type non signé INT . L'OP a demandé l'impression LONG numéros.



0
votes

% LD ou% LU en fonction du "long" dont vous avez besoin.


0 commentaires

9
votes

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);


4 commentaires

+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); 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.



0
votes

donné le code: xxx

La sortie compilée en mode 32 bits (sur MacOS 10.6.2) est la suivante: xxx

La sortie compilée en mode 64 bits est la suivante: xxx

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 ' était en C89 ainsi que C99, de sorte que cela devrait être correct. Les spécificateurs de conversion les plus normaux sont '% ld ' (un synonyme de '% li ') et '% LU ' (et '% lo 'et' % lx ') pour les valeurs non signées.


0 commentaires

0
votes

Essayez % LLU et pour attribuer une valeur à une variable longue, n'oubliez pas que vous devez ajouter ll à la fin du numéro, par exemple A = 99999999999LLL .


0 commentaires