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);

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

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


@ 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".



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).


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.


Jawaban Anda harus berupa komentar dan bukan jawaban dengan sendirinya.
Jaime Hablutzel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.