Jaki jest argument dla printf, który formatuje długi?

Funkcja printf pobiera typ argumentu, taki jak %d lub %i dla signed int. Jednak nie widzę nic dla long wartość.

Author: Rodrigo de Azevedo, 2008-09-01

7 answers

Umieść l (mała litera L) bezpośrednio przed specyfikatorem.

unsigned long n;
long m;

printf("%lu %ld", n, m);
 670
Author: postfuturist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-01 01:20:13

Myślę, że masz na myśli:

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

Lub

long n;
printf("%ld", n);   // signed long
 195
Author: Blorgbeard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-17 19:56:52

Na większości platform, long i int są tego samego rozmiaru (32 bity). Mimo to ma swój własny specyfik formatu:

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

Dla 64 bitów, chcesz long long:

long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned
No i oczywiście w Windows jest inaczej:
printf("%l64d", n); // signed
printf("%l64u", un); // unsigned

Często, gdy drukuję wartości 64-bitowe, pomocne jest drukowanie ich w formacie hex (zwykle z tak dużymi liczbami, są to wskaźniki lub pola bitowe).

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

Wydrukuje:

0x00000000DEADBEEF

Btw, "długi" już tyle nie znaczy (na mainstreamie x64). "int" to domyślny rozmiar int platformy, Zwykle 32 bity. "długi" jest zwykle tego samego rozmiaru. Mają jednak inną semantykę przenośności na starszych platformach (i nowoczesnych platformach wbudowanych!). "long long" to 64-bitowy numer i zwykle to, czego ludzie chcieli użyć, chyba że naprawdę wiedzieli, co robią edytując kawałek przenośnego kodu x-platform. Nawet wtedy prawdopodobnie użyliby makra zamiast uchwycić znaczenie semantyczne typu (np. 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 

Kiedyś, " int " było 16 bitów. Można by pomyśleć, że teraz będzie to 64 bity, ale nie, to spowodowałoby szalone problemy z przenośnością. Oczywiście nawet to jest uproszczenie tajemnej i bogatej w historię prawdy. Zobacz wiki:Integer

 81
Author: Dave Dopson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-07 19:46:35

To zależy, jeśli odnosisz się do unsigned long, znak formatujący to "%lu". Jeśli chodzi o signed long, znak formatujący to "%ld".

 17
Author: krato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-06 02:20:44
 12
Author: Rob Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-17 19:57:56

W przypadku, gdy chcesz wydrukować unsigned long long tak jak ja, użyj:

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

Dla wszystkich innych kombinacji, wierzę, że używasz tabeli z instrukcji printf , biorąc Etykietę wiersza, a następnie kolumny dla dowolnego typu, który próbujesz wydrukować(jak to robię z printf("%llu", n) powyżej).

 12
Author: Dolan Antenucci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-28 19:24:46

Myślę, że definitywna odpowiedź na to pytanie wymagałaby znajomości nazwy kompilatora i wersji, z której korzystasz oraz platformy (Typ procesora, SYSTEM OPERACYJNY itp.), dla którego jest kompilowany.

 0
Author: Andrew O'Reilly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-02 19:20:35