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.