La printf
funzione accetta un tipo di argomento, come %d
o %i
per a signed int
. Tuttavia, non vedo nulla per un long
valore.
La printf
funzione accetta un tipo di argomento, come %d
o %i
per a signed int
. Tuttavia, non vedo nulla per un long
valore.
Risposte:
Metti una l
(lettera minuscola L) direttamente prima dell'identificatore.
unsigned long n;
long m;
printf("%lu %ld", n, m);
printf("%ld", ULONG_MAX)
genera il valore come -1. Dovrebbe essere printf("%lu", ULONG_MAX)
per un tempo non firmato, come descritto di seguito da @Blorgbeard.
%ld
, per essere più armonico con la domanda OP.
%l
innescawarning: unknown conversion type character 0x20 in format [-Wformat]
Penso che intendi:
unsigned long n;
printf("%lu", n); // unsigned long
o
long n;
printf("%ld", n); // signed long
Sulla maggior parte delle piattaforme long
e int
hanno le stesse dimensioni (32 bit). Tuttavia, ha un proprio identificatore di formato:
long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned
Per 64 bit, vorresti un 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 formato 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
A proposito, "long" non significa più molto (sul mainstream x64). "int" è la dimensione int predefinita della piattaforma, in genere 32 bit. "lungo" ha di solito le stesse dimensioni. Tuttavia, hanno una semantica di portabilità diversa su piattaforme più vecchie (e piattaforme embedded moderne!). "long long" è un numero a 64 bit e di solito ciò che le persone intendevano usare a meno che non sapessero davvero cosa stavano facendo modificando un pezzo di codice portatile x-platform. Anche allora, probabilmente avrebbero usato una macro per catturare 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
In passato, "int" era di 16 bit. Penseresti che ora sarebbero 64 bit, ma no, ciò avrebbe causato problemi di portabilità folli. Naturalmente, anche questa è una semplificazione della verità arcana e ricca di storia. Vedi wiki: Integer
long
dimensioni 32" è ancora vera. Ad esempio, sono su Oracle Linux x86_64 / amd64 e con nvcc
un long
è di 8 byte.
Se stai cercando di stampare unsigned long long
com'ero, usa:
unsigned long long n;
printf("%llu", n);
Per tutte le altre combinazioni, credo che tu usi la tabella dal manuale printf , prendendo la riga, quindi l'etichetta della colonna per qualunque tipo tu stia provando a stampare (come faccio con printf("%llu", n)
sopra).
Penso che rispondere definitivamente a questa domanda richiederebbe la conoscenza del nome e della versione del compilatore che si sta utilizzando e della piattaforma (tipo di CPU, sistema operativo ecc.) Per cui si sta compilando.