Qual è l'argomento di printf che formatta a lungo?


Risposte:


634

Metti una l(lettera minuscola L) direttamente prima dell'identificatore.

unsigned long n;
long m;

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

14
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.
jammus,

2
In realtà, dovresti cambiarlo per essere %ld, per essere più armonico con la domanda OP.
Dr Beco,

Sì Dr Beco; inoltre, si %linnescawarning: unknown conversion type character 0x20 in format [-Wformat]
Patrizio Bertoni il

190

Penso che intendi:

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

o

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

73

Sulla maggior parte delle piattaforme longe inthanno 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


@MM Ho chiarito la mia risposta per evitare confusione.
Dave Dopson,

4
Giusto per chiarire: ci sono più architetture di x86 e x64, e su quelle architetture, char, short, int, long e long long hanno significati diversi. Ad esempio, un mcu a 32 bit con allineamento della memoria a 16 bit potrebbe utilizzare: char = short = int = 16 bit; lungo = 32 bit; long long = 64 bit
AndresR

1
@AndresR - assolutamente, e conta molto profondamente per le persone che fanno programmazione integrata (una volta ho creato un modulo kernel per un allarme fumo). Peccato per quelle povere anime quando cercano di usare un codice che non è stato scritto per la portabilità.
Dave Dopson,

Non sono così sicuro che "la maggior parte delle piattaforme ha longdimensioni 32" è ancora vera. Ad esempio, sono su Oracle Linux x86_64 / amd64 e con nvccun longè di 8 byte.
ragerdl,

"Oh, e ovviamente, è diverso in Windows". Esiste una soluzione multipiattaforma?
Aaron Franke,

17

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



12

Se stai cercando di stampare unsigned long longcom'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).


0

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.


La tua risposta dovrebbe essere un commento e non una risposta da sola.
Jaime Hablutzel,
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.