The printf
Fungsi mengambil jenis argumen, seperti %d
atau %i
untuk signed int
. Namun, saya tidak melihat apa pun untuk long
nilai.
The printf
Fungsi mengambil jenis argumen, seperti %d
atau %i
untuk signed int
. Namun, saya tidak melihat apa pun untuk long
nilai.
Jawaban:
Letakkan l
(huruf kecil huruf L) langsung sebelum specifier.
unsigned long n;
long m;
printf("%lu %ld", n, m);
printf("%ld", ULONG_MAX)
menampilkan nilai sebagai -1. Seharusnya tidak printf("%lu", ULONG_MAX)
ditandatangani lama seperti yang dijelaskan oleh @ Blorgbeard di bawah ini.
%ld
, agar lebih harmonis dengan pertanyaan OP.
%l
pemicuwarning: unknown conversion type character 0x20 in format [-Wformat]
Saya pikir maksud Anda:
unsigned long n;
printf("%lu", n); // unsigned long
atau
long n;
printf("%ld", n); // signed long
Pada sebagian besar platform, long
dan int
memiliki 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
long
ukuran 32" masih benar. Misalnya, aku di Oracle Linux x86_64 / amd64, dan dengan nvcc
sebuah long
adalah 8 byte.
%ld
lihat printf
referensi di cplusplus.com
Jika Anda ingin mencetak unsigned long long
seperti 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).
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.