printf
Функція приймає тип параметра, наприклад, %d
або %i
для signed int
. Однак я нічого не бачу в long
ціні.
printf
Функція приймає тип параметра, наприклад, %d
або %i
для signed int
. Однак я нічого не бачу в long
ціні.
Відповіді:
Поставте l
(маленьку літеру L) безпосередньо перед специфікатором.
unsigned long n;
long m;
printf("%lu %ld", n, m);
printf("%ld", ULONG_MAX)
виводить значення як -1. Має бути printf("%lu", ULONG_MAX)
без підпису, як описано нижче @Blorgbeard.
%ld
, щоб бути більш гармонійним з питанням про ОП.
%l
спрацьовуєwarning: unknown conversion type character 0x20 in format [-Wformat]
Я думаю, ти маєш на увазі:
unsigned long n;
printf("%lu", n); // unsigned long
або
long n;
printf("%ld", n); // signed long
На більшості платформ, 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
До речі, "довгий" більше нічого не означає (в основному x64). "int" - це розмір int платформи за замовчуванням, як правило, 32 біта. "довгий", як правило, однакового розміру. Однак вони мають різну семантику портативності на старих платформах (і сучасних вбудованих платформах!). "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 біти, але ні, це спричинило б шалені проблеми з портативністю. Звичайно, навіть це спрощення таємничої та багатої на історію правди. Дивіться вікі: Цілість
long
розмір 32" все ще вірно. Наприклад, я перебуваю на Oracle Linux x86_64 / amd64, а з nvcc
a long
- 8 байт.
%ld
див. printf
посилання на cplusplus.com
У випадку, якщо ви хочете друкувати unsigned long long
як я, скористайтеся:
unsigned long long n;
printf("%llu", n);
Для всіх інших комбінацій, я вважаю, що ви використовуєте таблицю з посібника printf , беручи рядок, а потім мітку стовпців для будь-якого типу, який ви намагаєтеся надрукувати (як я роблю з printf("%llu", n)
вище).
Думаю, щоб остаточно відповісти на це питання, знадобиться знати ім’я компілятора та версію, яку ви використовуєте, і платформу (тип процесора, ОС тощо), для якої він компілюється.