Каков аргумент для printf, который форматирует длинные?

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

+344
источник поделиться
7 ответов

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

unsigned long n;
long m;

printf("%lu %ld", n, m);
+439
источник

Думаю, вы имеете в виду:

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

или

long n;
printf("%ld", n);   // signed long
+176
источник

На большинстве платформ 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

Btw, "long" больше не означает этого (в основном х64). "int" - это стандартный размер платформы по умолчанию, обычно 32 бит. "long" обычно имеет одинаковый размер. Тем не менее, они имеют другую семантику переносимости на старых платформах (и современные встроенные платформы!). "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 бит, но нет, это вызвало бы безумные проблемы с переносимостью. Конечно, даже это упрощение тайной и богатой историей правды. См. wiki: Integer

+47
источник

Это зависит, если вы ссылаетесь на unsigned long, символ форматирования "%lu". Если вы ссылаетесь на подписанный длинный символ форматирования "%ld".

+15
источник

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

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

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

+7
источник

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос