Функция printf
принимает тип аргумента, такой как %d
или %i
для signed int
. Тем не менее, я ничего не вижу для значения long
.Каков аргумент для printf, который форматирует длинные?
ответ
Положите l
(строчное письмо L) непосредственно перед спецификатором.
unsigned long n;
long m;
printf("%lu %ld", n, m);
Я думаю, что вы имеете в виду:
unsigned long n;
printf("%lu", n); // unsigned long
или
long n;
printf("%ld", n); // signed long
Я думаю, что ответить на этот вопрос окончательно потребуется знать имя компилятора и версии, которую вы используете и платформу (Тип ЦП, ОС и т. Д.), Которые он компилирует.
В случае, если вы хотите напечатать unsigned long long
как я, использование:
unsigned long long n;
printf("%llu", n);
Для всех других комбинаций, я полагаю, вы используете таблицу из the printf manual, принимая строку, то метка колонки для любого типа вы пытаетесь распечатать (как и в случае с printf("%llu", n)
выше).
На большинстве платформ 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, "длинный" не означает, что гораздо больше (на основной x64). «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
Это зависит, если вы имеете в виду unsigned long, символ форматирования "%lu"
. Если вы ссылаетесь на подписанный длинный символ форматирования "%ld"
.
`printf ("% ld ", ULONG_MAX)` выводит значение как -1. Должно быть `printf ("% lu ", ULONG_MAX)` для unsigned long, как описано ниже @Blorgbeard. – jammus 2011-11-12 16:03:59
Изменен мой ответ, чтобы быть правильным, видя, что это принятый ответ. Я не хочу приводить людей в заблуждение. – postfuturist 2011-11-13 05:01:58