Apa argumen untuk printf yang memformat panjang?

Jawaban:

634

Letakkan l(huruf kecil huruf L) langsung sebelum specifier.

unsigned long n;
long m;

printf("%lu %ld", n, m);
postfuturist
sumber
14
printf("%ld", ULONG_MAX)menampilkan nilai sebagai -1. Seharusnya tidak printf("%lu", ULONG_MAX)ditandatangani lama seperti yang dijelaskan oleh @ Blorgbeard di bawah ini.
jammus
2
Sebenarnya, Anda harus mengubahnya menjadi %ld, agar lebih harmonis dengan pertanyaan OP.
Dr Beco
Yep Dr Beco; lebih lanjut, hanya %lpemicuwarning: unknown conversion type character 0x20 in format [-Wformat]
Patrizio Bertoni
190

Saya pikir maksud Anda:

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

atau

long n;
printf("%ld", n);   // signed long
Blorgbeard keluar
sumber
73

Pada sebagian besar platform, longdan intmemiliki ukuran yang sama (32 bit). Namun, ia memiliki penentu format sendiri:

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

Untuk 64 bit, Anda ingin long long:

long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned

Oh, dan tentu saja, ini berbeda di Windows:

printf("%l64d", n); // signed
printf("%l64u", un); // unsigned

Seringkali, ketika saya mencetak nilai 64-bit, saya merasa terbantu untuk mencetaknya dalam hex (biasanya dengan angka yang besar, itu adalah pointer atau bidang bit).

unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"

akan dicetak:

0x00000000DEADBEEF

Btw, "panjang" tidak berarti lagi (pada mainstream x64). "int" adalah ukuran int standar platform, biasanya 32 bit. "panjang" biasanya berukuran sama. Namun, mereka memiliki semantik portabilitas yang berbeda pada platform lama (dan platform embedded modern!). "long long" adalah angka 64-bit dan biasanya yang dimaksudkan orang untuk digunakan kecuali mereka benar-benar tahu apa yang mereka lakukan mengedit sepotong kode portabel x-platform. Bahkan kemudian, mereka mungkin akan menggunakan makro sebagai gantinya untuk menangkap makna semantik dari tipe tersebut (mis. 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 

Kembali pada hari itu, "int" adalah 16 bit. Anda akan berpikir itu sekarang akan menjadi 64 bit, tetapi tidak, itu akan menyebabkan masalah portabilitas yang gila. Tentu saja, bahkan ini adalah penyederhanaan dari rahasia dan kebenaran yang kaya akan sejarah. Lihat wiki: Integer

Dave Dopson
sumber
@ MM Saya mengklarifikasi jawaban saya untuk menghindari kebingungan.
Dave Dopson
4
Hanya untuk memperjelas: ada lebih banyak arsitektur daripada x86 dan x64, dan pada arsitektur itu, char, pendek, int, panjang dan panjang memiliki arti yang berbeda. Misalnya, mcu 32 bit dengan perataan memori 16 bit dapat menggunakan: char = short = int = 16 bit; panjang = 32 bit; long panjang = 64 bit
AndresR
1
@AndresR - benar-benar, dan itu sangat penting bagi orang-orang yang melakukan pemrograman tertanam (saya pernah membangun modul kernel untuk alarm asap). Kasihan jiwa-jiwa malang itu ketika mereka mencoba menggunakan kode yang tidak ditulis untuk portabilitas.
Dave Dopson
Saya tidak begitu yakin bahwa "sebagian besar platform memiliki longukuran 32" masih benar. Misalnya, aku di Oracle Linux x86_64 / amd64, dan dengan nvccsebuah longadalah 8 byte.
ragerdl
"Oh, dan tentu saja, ini berbeda di Windows". Apakah ada solusi lintas platform?
Aaron Franke
17

Itu tergantung, jika Anda mengacu pada unsigned lama karakter formatnya "%lu". Jika Anda merujuk untuk menandatangani lama karakter pemformatan adalah "%ld".

krato
sumber
12

Jika Anda ingin mencetak unsigned long longseperti saya, gunakan:

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

Untuk semua kombinasi lain, saya yakin Anda menggunakan tabel dari manual printf , mengambil baris, lalu label kolom untuk jenis apa pun yang Anda coba cetak (seperti yang saya lakukan dengan di printf("%llu", n)atas).

Dolan Antenucci
sumber
0

Saya pikir untuk menjawab pertanyaan ini secara pasti akan membutuhkan mengetahui nama dan versi kompiler yang Anda gunakan dan platform (tipe CPU, OS dll) yang dikompilasi untuknya.

Andrew O'Reilly
sumber
Jawaban Anda harus berupa komentar dan bukan jawaban dengan sendirinya.
Jaime Hablutzel