Какой аргумент для printf, который форматирует long? - PullRequest
430 голосов
/ 02 сентября 2008

Функция printf принимает тип аргумента, например %d или %i для signed int. Однако я ничего не вижу для значения long.

Ответы [ 7 ]

561 голосов
/ 02 сентября 2008

Поставьте l (строчная буква L) непосредственно перед спецификатором.

unsigned long n;
long m;

printf("%lu %ld", n, m);
186 голосов
/ 02 сентября 2008

Я думаю, что вы имеете в виду:

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

или

long n;
printf("%ld", n);   // signed long
65 голосов
/ 30 января 2013

На большинстве платформ long и int имеют одинаковый размер (32 бита). Тем не менее, он имеет свой собственный спецификатор формата:

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

Для 64 битов вы хотите long long:

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

О, и, конечно, в Windows все по-другому:

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

Часто, когда я печатаю 64-битные значения, бывает полезно напечатать их в шестнадцатеричном формате (обычно с такими большими числами, они являются указателями или битовыми полями).

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

напечатает:

0x00000000DEADBEEF

Кстати, "long" уже не так много значит (в основном x64). "int" - это int размер платформы по умолчанию, обычно 32 бита. «длинный» обычно одинакового размера. Тем не менее, они имеют различную семантику переносимости на старых платформах (и современных встроенных платформах!). «long long» - это 64-битное число, которое обычно используют люди, если они действительно не знают, что делают, редактируя кусок переносимого кода на x-платформе. Даже тогда они, вероятно, вместо этого использовали бы макрос для захвата семантического значения типа (например, 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 

Раньше "int" составлял 16 бит. Можно подумать, что теперь это будет 64 бита, но нет, это вызвало бы безумные проблемы с переносимостью. Конечно, даже это упрощение тайной и богатой истории правды. См вики: целое число

17 голосов
/ 06 марта 2013

Зависит от того, если вы имеете в виду длинную без знака, символ форматирования - "%lu". Если вы имеете в виду длинную подпись, то форматирующий символ будет "%ld".

11 голосов
/ 28 октября 2012

Если вы хотите напечатать unsigned long long, как я, используйте:

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

Для всех других комбинаций, я полагаю, вы используете таблицу из руководства printf , взяв строку, а затем метку столбца для любого типа, который вы пытаетесь напечатать (как я делаю с printf("%llu", n) выше ).

11 голосов
/ 02 сентября 2008
0 голосов
/ 02 сентября 2008

Я думаю, что для окончательного ответа на этот вопрос потребуется знание имени и версии компилятора, который вы используете, и платформы (тип процессора, ОС и т. Д.), Для которой он компилируется.

...