Wat is het argument voor printf dat een long formatteert?

De functie printfheeft een argumenttype, zoals %dof %ivoor een signed int. Ik zie echter niets voor een longwaarde.


Antwoord 1, autoriteit 100%

Zet een l(kleine letter L) direct voor de specificatie.

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

Antwoord 2, autoriteit 29%

Ik denk dat je bedoelt:

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

of

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

Antwoord 3, autoriteit 12%

Op de meeste platforms zijn longen inteven groot (32 bits). Toch heeft het zijn eigen formaatspecificatie:

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

Voor 64 bits wil je een long long:

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

O, en natuurlijk is het anders in Windows:

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

Als ik 64-bits waarden afdruk, vind ik het vaak handig om ze in hex af te drukken (meestal met zulke grote getallen, het zijn aanwijzers of bitvelden).

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

zal afdrukken:

0x00000000DEADBEEF

Trouwens, “lang” betekent niet zoveel meer (op mainstream x64). “int” is de standaard int-grootte van het platform, meestal 32 bits. “lang” is meestal even groot. Ze hebben echter verschillende draagbaarheidssemantiek op oudere platforms (en moderne embedded platforms!). “long long” is een 64-bits nummer en meestal bedoelden mensen het te gebruiken, tenzij ze echt wisten wat ze aan het doen waren met het bewerken van een stuk draagbare x-platformcode. Zelfs dan hadden ze waarschijnlijk een macro gebruikt om de semantische betekenis van het type vast te leggen (bijv. 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 

Vroeger was ‘int’ 16 bits. Je zou denken dat het nu 64 bits zou zijn, maar nee, dat zou waanzinnige draagbaarheidsproblemen hebben veroorzaakt. Natuurlijk is zelfs dit een vereenvoudiging van de mysterieuze en geschiedenisrijke waarheid. Zie wiki:Integer


Antwoord 4, autoriteit 2%

Het hangt ervan af, of u verwijst naar lang zonder teken, het opmaakteken "%lu"is. Als u verwijst naar lang ondertekend, is het opmaakteken "%ld".


Antwoord 5, autoriteit 2%

%ldzie printfreferentie op cplusplus.com


Antwoord 6, autoriteit 2%

Als je unsigned long longwilt afdrukken zoals ik was, gebruik dan:

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

Voor alle andere combinaties gebruik je volgens mij de tabel uit de printf-handleiding, waarbij u de rij en vervolgens het kolomlabel neemt voor het type dat u probeert af te drukken (zoals ik doe met printf("%llu", n)hierboven).


Antwoord 7

Ik denk dat om deze vraag definitief te beantwoorden, je de compilernaam en -versie die je gebruikt en het platform (CPU-type, besturingssysteem enz.) waarvoor het compileert moet weten.

Other episodes