Comment imprimer un «long non signé» en C?


344

Je ne peux jamais comprendre comment imprimer un unsigned longtype de données en C.

Supposons que unsigned_fooc'est un unsigned long, alors j'essaye:

  • printf("%lu\n", unsigned_foo)
  • printf("%du\n", unsigned_foo)
  • printf("%ud\n", unsigned_foo)
  • printf("%ll\n", unsigned_foo)
  • printf("%ld\n", unsigned_foo)
  • printf("%dl\n", unsigned_foo)

Et tous impriment une sorte de -123123123numéro au lieu de unsigned longcelui que j'ai.

Réponses:


499

%luest le format correct pour unsigned long. On dirait qu'il y a d'autres problèmes en jeu ici, comme une corruption de mémoire ou une variable non initialisée. Peut-être nous montrer une image plus grande?


12
Oups, %lutravaillé cette fois. Merci. Quelque chose d'autre a dû se produire avant et cela n'a pas fonctionné.
bodacydo

1
@bodacydo: Si vous avez un bug, il peut apparaître de manière semi-aléatoire ... assurez-vous que votre variable a une valeur valide avant d'essayer de l'imprimer.
Thanatos

1
Même si la variable n'est pas initialisée, il ne devrait y avoir aucun moyen pour printf d'atteindre un point où il pourrait imprimer un signe moins lorsque le spécificateur de format était %lu. Techniquement, c'est un comportement indéfini, mais en réalité, la variable a une valeur imprévisible qui est transmise à printf que printf interprète ensuite comme non signée. Je suppose que le problème d'origine de bodacydo était que le flux atteignait un appel printf incorrect au lieu de celui prévu ...
R .. GitHub STOP HELPING ICE

8
@Anisha Kaul:% lu est une spécification de conversion valide,% ul ne l'est pas. %lu, éclaté est: %- démarre une "spécification de conversion"; l- le modificateur de longueur, lsignifie "[unsigned] long int"; u- le spécificateur de conversion, uest destiné unsigned intà être imprimé sous forme décimale. Parce que nous avons donné le modificateur de longueur l, il accepte alors un unsigned long int. Les lettres doivent être dans cet ordre: pourcentage, longueur, conversion. (Il y a quelques options supplémentaires, telles que la largeur et la précision, que vous pouvez ajouter. Voir la page de manuel , car elle documente tout cela précisément!)
Thanatos

1
% ul affichera simplement non signé (avec% u), puis la lettre "l" textuellement. Tout comme "% uw" s'imprime non signé, suivi de la lettre "w". % démarre la convspec, u (ou un autre caractère, comme d, s, c ...) la termine.
Veky

30
  • %lupour long non signé
  • %llupour non signé long long

13
Convention de Yoda: "unsigned long" "(l) ong (u) nsigned" est.
Reb.Cabin

28

Pour int %d

Pour long int %ld

Pour long long int %lld

Pour non signé long long int %llu


23

De toutes les combinaisons que vous avez essayé, %ldet %lusont les seuls qui sont valides format printf spécificateurs du tout. %lu(décimal long non signé), %lxou %lX(hex long avec des lettres minuscules ou majuscules) et %lo(octal long) sont les seuls spécificateurs de format valides pour une variable de type non signé long (bien sûr, vous pouvez ajouter des modificateurs de largeur de champ, de précision, etc. entre les %et le l).


1
% ld fonctionnera correctement jusqu'à ce que la valeur de std :: numeric_limits <unsigned long> :: max () / 2. Au-dessus de% ld, une valeur incorrecte sera imprimée (valeur négative).
Kaushik Acharya

1
@KaushikAcharya: Non, au-dessus c'est UB. Et il est sans doute même UB avant cela, car printfest spécifié pour exiger les types d'arguments corrects exacts sans les tolérances qui va_argauraient.
R .. GitHub STOP HELPING ICE



8

Le spécificateur correct pour le long non signé est %lu.

Si vous n'obtenez pas la valeur exacte que vous attendez, il peut y avoir des problèmes dans votre code.

Veuillez copier votre code ici. Alors peut-être que quelqu'un pourra mieux vous dire quel est le problème.


-5

J'ai eu le même problème. Essayez "% ul", cela fonctionne pour moi.


6
Cette question a reçu une réponse approfondie il y a plus de 8 ans. Pleae s'assure qu'une nouvelle réponse ajoute de nouvelles informations et plus important est même correct.
Gerhardh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.