Що таке аргумент для printf, який форматується довгим?


Відповіді:


633

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

unsigned long n;
long m;

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

14
printf("%ld", ULONG_MAX)виводить значення як -1. Має бути printf("%lu", ULONG_MAX)без підпису, як описано нижче @Blorgbeard.
jammus

2
Насправді, ви повинні змінити це %ld, щоб бути більш гармонійним з питанням про ОП.
Д-р Беко

Д-р Беко; далі, лише %lспрацьовуєwarning: unknown conversion type character 0x20 in format [-Wformat]
Патрісіо Бертоні


73

На більшості платформ, 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 біти, але ні, це спричинило б шалені проблеми з портативністю. Звичайно, навіть це спрощення таємничої та багатої на історію правди. Дивіться вікі: Цілість


@MM Я уточнив свою відповідь, щоб уникнути плутанини.
Дейв Допсон

4
Тільки для уточнення: архітектур більше, ніж x86 та x64, а для цих архітектур char, short, int, long і long long мають різні значення. Наприклад, 32-бітний mcu з 16-бітним вирівнюванням пам'яті може використовувати: char = short = int = 16 біт; довга = 32 біта; long long = 64 біт
AndresR

1
@AndresR - абсолютно, і це дуже важливо для людей, які займаються вбудованим програмуванням (я один раз побудував модуль ядра для димової сигналізації). Пошкодуйте тих бідних душ, коли вони намагаються використовувати код, який не був записаний для переносу.
Дейв Допсон

Я не дуже впевнений, що "більшість платформ має longрозмір 32" все ще вірно. Наприклад, я перебуваю на Oracle Linux x86_64 / amd64, а з nvcca long- 8 байт.
ragerdl

"О, і, звичайно, в Windows". Чи існує кросплатформене рішення?
Аарон Франке

17

Це залежить, якщо ви посилаєтесь на ненаписаний довгий символ символу форматування "%lu". Якщо ви посилаєтесь на підписані довгі символи форматування є "%ld".



12

У випадку, якщо ви хочете друкувати unsigned long longяк я, скористайтеся:

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

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


0

Думаю, щоб остаточно відповісти на це питання, знадобиться знати ім’я компілятора та версію, яку ви використовуєте, і платформу (тип процесора, ОС тощо), для якої він компілюється.


Ваша відповідь має бути коментарем, а не відповіддю сама по собі.
Хайме Хаблуцель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.