2008-09-01 5 views

ответ

464

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

unsigned long n; 
long m; 

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

`printf ("% ld ", ULONG_MAX)` выводит значение как -1. Должно быть `printf ("% lu ", ULONG_MAX)` для unsigned long, как описано ниже @Blorgbeard. – jammus 2011-11-12 16:03:59

+4

Изменен мой ответ, чтобы быть правильным, видя, что это принятый ответ. Я не хочу приводить людей в заблуждение. – postfuturist 2011-11-13 05:01:58

179

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

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

или

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

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

8

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

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

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

49

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

15

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

 Смежные вопросы

  • Нет связанных вопросов^_^