Come stampare "unsigned long" in C?


344

Non riesco mai a capire come stampare il unsigned longtipo di dati in C.

Supponiamo che unsigned_foosia un unsigned long, quindi provo:

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

E tutti loro stampano una sorta di -123123123numero invece di unsigned longquello che ho.

Risposte:


499

%luè il formato corretto per unsigned long. Sembra che ci siano altri problemi in gioco qui, come il danneggiamento della memoria o una variabile non inizializzata. Forse ci fai vedere un quadro più grande?


12
Oops, %luquesta volta ha funzionato. Grazie. Qualcos'altro deve essere successo prima e non ha funzionato.
bodacydo,

1
@bodacydo: se hai un bug, potrebbe apparire in modo semi-casuale ... assicurati che la tua variabile abbia un valore valido prima di provare a stamparlo.
Thanatos,

1
Anche se la variabile non è inizializzata, non dovrebbe esserci alcun modo in cui printf raggiunga un punto in cui potrebbe stampare un segno meno quando lo specificatore del formato era %lu. Tecnicamente è un comportamento indefinito ma in realtà la variabile ha un valore imprevedibile che viene passato a printf che printf interpreta quindi come non firmato. Immagino che il problema originale di bodacydo fosse il flusso che raggiungeva una chiamata di stampa errata invece di quella prevista ...
R .. GitHub

8
@Anisha Kaul:% lu è una specifica di conversione valida,% ul no. %lu, suddiviso è: %- avvia una "specifica di conversione"; l- il modificatore di lunghezza, lsignifica "[unsigned] long int"; u- lo specificatore di conversione, udeve unsigned intessere stampato come decimale. Perché abbiamo dato il modificatore di lunghezza l, quindi accetta un unsigned long int. Le lettere devono essere in questo ordine: percentuale, lunghezza, conversione. (Ci sono alcune altre opzioni, come larghezza e precisione, che puoi aggiungere. Vedi la pagina man , in quanto documenta esattamente tutto questo!)
Thanatos

1
% ul stamperà semplicemente senza segno (con% u), quindi la lettera "l" alla lettera. Proprio come "% uw" verrà stampato senza segno, seguito dalla lettera "w". % avvia il convspec, u (o qualche altro carattere, come d, s, c ...) lo termina.
Veky,

30
  • %luper a lungo senza segno
  • %lluper unsigned long long

13
Convenzione di Yoda: "unsigned long" "(l) ong (u) nsigned" è.
Reb.Cabin l'

28

Per int %d

Per lungo int %ld

Per molto tempo int %lld

Per int. Long long int %llu


23

Di tutte le combinazioni che hai provato, %lde %lusono le uniche che sono affatto validi identificatori di formato printf. %lu(decimale senza segno lungo) %lxo %lX(esadecimale lungo con lettere minuscole o maiuscole) e %lo(ottale lungo) sono gli unici identificatori di formato validi per una variabile di tipo unsigned long (ovviamente è possibile aggiungere modificatori di larghezza di campo, precisione, ecc. tra i %e il l).


1
% ld funzionerà bene fino al valore di std :: numeric_limits <unsigned long> :: max () / 2. Inoltre,% ld stamperà un valore errato (valore negativo).
Kaushik Acharya,

1
@KaushikAcharya: No, sopra è UB. Ed è probabilmente anche UB prima di ciò, poiché printfè specificato per richiedere gli esatti tipi di argomenti corretti senza le quote che va_argavrebbero.
R .. GitHub FERMA AIUTANDO ICE

9
int main()
{
    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();
}

Questo sarà utile. . .



8

Lo specificatore corretto per unsigned long è %lu.

Se non ottieni il valore esatto che ti aspetti, potrebbero esserci dei problemi nel tuo codice.

Per favore copia il tuo codice qui. Allora forse qualcuno può dirti qual è il problema.


-5

Ho avuto lo stesso problema. Prova "% ul", funziona per me.


6
A questa domanda è stata ampiamente data risposta più di 8 anni fa. Per favore assicurati che una nuova risposta aggiunga nuove informazioni e che più importante sia persino corretto.
Gerhardh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.