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

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

Ответ 1

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

unsigned long n;
long m;

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

Ответ 2

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

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

или

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

Ответ 3

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

Ответ 4

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

Ответ 6

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

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

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

Ответ 7

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