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

344

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

Теги:
printf

7 ответов

460
Лучший ответ

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

unsigned long n;
long m;

printf("%lu %ld", n, m);
  • 11
    printf("%ld", ULONG_MAX) выводит значение как -1. Должно быть printf("%lu", ULONG_MAX) для unsigned long, как описано @Blorgbeard ниже.
  • 4
    Изменил мой ответ на правильный, видя, что это принятый ответ. Я не хочу вводить людей в заблуждение.
Показать ещё 2 комментария
168

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

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

или

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

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

  • 0
    @ ММ Я уточнил свой ответ, чтобы избежать путаницы.
  • 3
    Просто для пояснения: существует больше архитектур, чем x86 и x64, и в этих архитектурах char, short, int, long и long long имеют разные значения. Например, 32-битный MCU с 16-битным выравниванием памяти может использовать: char = short = int = 16 бит; long = 32 бита; long long = 64 бита
Показать ещё 1 комментарий
15

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

9
7

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

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

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню