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.

Bodacydo
la source

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?

Thanatos
la source
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
NealCaffery
la source
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

Linkon
la source
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).

R .. GitHub ARRÊTEZ D'AIDER LA GLACE
la source
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
9
int main()
{
    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();
}

Ce sera utile. . .

Sanjith Bravo Dastan
la source
9

Le format est %lu.

Veuillez vérifier les différents autres types de données et leur utilisation dans printf ici

Praveen S
la source
2
Divers comportements non standard y sont documentés sans le marquer comme non standard. POSIX est la norme en ligne la plus facile d'accès pour printf; les extensions au-delà de l'ISO C sont marquées avec la balise "CX": opengroup.org/onlinepubs/9699919799/functions/fprintf.html
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.

Kumar Alok
la source
-5

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

Joseleo
la source
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