Qual è l’argomento per printf che formatta un lungo?

La funzione printf accetta un tipo di argomento, come %d o %i per un signed int . Tuttavia, non vedo nulla per un valore long .

Metti una l (lettera minuscola L) direttamente davanti allo specificatore.

 unsigned long n; long m; printf("%lu %ld", n, m); 

Penso che tu voglia dire:

 unsigned long n; printf("%lu", n); // unsigned long 

o

 long n; printf("%ld", n); // signed long 

Sulla maggior parte delle piattaforms, long e int hanno la stessa dimensione (32 bit). Tuttavia, ha il proprio specificatore di formato:

 long n; unsigned long un; printf("%ld", n); // signed printf("%lu", un); // unsigned 

Per 64 bit, vorresti long long :

 long long n; unsigned long long un; printf("%lld", n); // signed printf("%llu", un); // unsigned 

Oh, e ovviamente, è diverso in Windows:

 printf("%l64d", n); // signed printf("%l64u", un); // unsigned 

Spesso, quando stampo valori a 64 bit, trovo utile stamparli in esadecimale (di solito con numeri così grandi, sono puntatori o campi di bit).

 unsigned long long n; printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F" 

stamperà:

 0x00000000DEADBEEF 

Btw, “long” non significa più molto (su mainstream x64). “int” è la dimensione int predefinita della piattaforma, in genere 32 bit. “long” è solitamente della stessa dimensione. Tuttavia, hanno una semantica della portabilità diversa su piattaforms meno recenti (e su piattaforms embedded moderne!). “long long” è un numero a 64 bit e di solito quello che le persone intendevano usare a meno che non sapessero davvero cosa stavano facendo modificando un pezzo di codice portatile per piattaforma x. Anche allora probabilmente avrebbero usato una macro per acquisire il significato semantico del tipo (es. Uint64_t).

 char c; // 8 bits short s; // 16 bits int i; // 32 bits (on modern platforms) long l; // 32 bits long long ll; // 64 bits 

Indietro nel giorno, “int” era 16 bit. Penseresti che ora sarebbe a 64 bit, ma no, questo avrebbe causato problemi di portabilità insani. Naturalmente, anche questa è una semplificazione della verità arcana e ricca di storia. Vedi wiki: intero

Dipende, se ti riferisci a unsigned long il carattere di formattazione è "%lu" . Se ti stai riferendo a firmare a lungo il carattere di formattazione è "%ld" .

%ld vedere il riferimento a printf su cplusplus.com

Se stai cercando di stampare unsigned long long come me, usa:

 unsigned long long n; printf("%llu", n); 

Per tutte le altre combinazioni, credo che si usi la tabella dal manuale printf , prendendo la riga, quindi l’etichetta della colonna per qualsiasi tipo si stia tentando di stampare (come faccio con printf("%llu", n) sopra).

Penso che per rispondere a questa domanda in modo definitivo sia necessario conoscere il nome e la versione del compilatore che si sta utilizzando e la piattaforma (tipo di CPU, sistema operativo ecc.) Per la quale si sta compilando.