Bagaimana cara mencetak "unsigned long" dalam C?

342

Saya tidak pernah mengerti bagaimana cara mencetak unsigned longdatatype dalam C.

Misalkan unsigned_fooadalah unsigned long, maka saya coba:

  • printf("%lu\n", unsigned_foo)
  • printf("%du\n", unsigned_foo)
  • printf("%ud\n", unsigned_foo)
  • printf("%ll\n", unsigned_foo)
  • printf("%ld\n", unsigned_foo)
  • printf("%dl\n", unsigned_foo)

Dan mereka semua mencetak semacam -123123123nomor alih-alih unsigned longyang saya miliki.

bodacydo
sumber

Jawaban:

499

%luadalah format yang benar untuk unsigned long. Kedengarannya seperti ada masalah lain yang sedang dimainkan di sini, seperti kerusakan memori atau variabel yang tidak diinisialisasi. Mungkin menunjukkan kepada kita gambaran yang lebih besar?

Thanatos
sumber
12
Ups, %lukerjakan kali ini. Terima kasih. Sesuatu yang lain pasti telah terjadi sebelumnya dan itu tidak berhasil.
bodacydo
1
@bodacydo: Jika Anda memiliki bug, bug itu mungkin muncul secara semi-acak ... pastikan variabel Anda memiliki nilai yang valid sebelum Anda mencoba mencetaknya.
Thanatos
1
Bahkan jika variabel tidak diinisialisasi, seharusnya tidak ada cara printf mencapai titik di mana ia bisa mencetak tanda minus ketika format specifier berada %lu. Secara teknis itu adalah perilaku yang tidak terdefinisi tetapi dalam kenyataannya variabel memiliki nilai tak terduga yang diteruskan ke printf yang printf kemudian ditafsirkan sebagai tidak ditandatangani. Saya menduga masalah asli bodacydo adalah aliran mencapai panggilan printf yang salah, bukan yang dimaksudkan ...
R .. GitHub BERHENTI MEMBANTU ICE
8
@Anisha Kaul:% lu adalah spesifikasi konversi yang valid,% ul tidak. %lu, pecah adalah: %- memulai "spesifikasi konversi"; l- pengubah panjang, lberarti "[tidak ditandatangani] long int"; u- specifier konversi, uadalah untuk unsigned intdicetak sebagai desimal. Karena kami memberi pengubah panjang l, maka ia menerima unsigned long int. Surat-surat harus dalam urutan: persen, panjang, konversi. (Ada beberapa opsi lagi, seperti lebar dan presisi, yang dapat Anda tambahkan. Lihat halaman manual , karena mendokumentasikan semua ini dengan tepat!)
Thanatos
1
% ul hanya akan mencetak yang tidak ditandatangani (dengan% u), dan kemudian huruf "l" kata demi kata. Sama seperti "% uw" akan mencetak tanpa tanda, diikuti dengan huruf "w". % memulai convspec, u (atau beberapa karakter lain, seperti d, s, c ...) mengakhirinya.
Veky
30
  • %luuntuk panjang unsigned
  • %lluuntuk unsigned lama lama
NealCaffery
sumber
13
Konvensi Yoda: "unsigned long" "(l) ong (u) nsigned" is.
Reb.Cabin
28

Untuk int %d

Untuk int panjang %ld

Untuk int panjang %lld

Untuk int panjang tanpa tanda tangan %llu

Linkon
sumber
23

Dari semua kombinasi yang Anda coba, %lddan %luhanya kombinasi yang merupakan penentu format printf yang valid sama sekali. %lu(panjang unsigned desimal), %lxatau %lX(hex panjang dengan huruf kecil atau huruf besar), dan %lo(oktal panjang) adalah satu-satunya penentu format yang valid untuk variabel tipe unsigned long (tentu saja Anda dapat menambahkan lebar bidang, ketepatan, dll. pengubah antara %dan l).

R .. GitHub BERHENTI MEMBANTU ICE
sumber
1
% ld akan berfungsi dengan baik hingga nilai std :: numeric_limits <unsigned long> :: max () / 2. Di atas% ld akan mencetak nilai yang salah (nilai negatif).
Kaushik Acharya
1
@ KaushikAcharya: Tidak, di atas itu adalah UB. Dan itu bisa dibilang bahkan UB sebelum itu, karena printfditentukan untuk memerlukan jenis argumen yang tepat tanpa tunjangan yang va_argseharusnya.
R .. GitHub BERHENTI MEMBANTU ICE
9
int main()
{
    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();
}

Ini akan sangat membantu. . .

Sanjith Bravo Dastan
sumber
9

Formatnya adalah %lu.

Silakan periksa tentang berbagai tipe data lainnya dan penggunaannya di printf di sini

Praveen S
sumber
2
Berbagai perilaku tidak standar didokumentasikan di sana tanpa menandainya sebagai tidak standar. POSIX adalah standar online paling mudah diakses untuk printf; ekstensi di luar ISO C ditandai dengan tag "CX": opengroup.org/onlinepubs/9699919799/functions/fprintf.html
R .. GitHub STOP HELPING ICE
8

Specifier yang benar untuk lama tak bertanda adalah %lu.

Jika Anda tidak mendapatkan nilai persis yang Anda harapkan maka mungkin ada beberapa masalah dalam kode Anda.

Silakan salin kode Anda di sini. Maka mungkin seseorang dapat memberi tahu Anda dengan lebih baik apa masalahnya.

Kumar Alok
sumber
-5

Saya memiliki masalah yang sama. Coba "% ul", itu bekerja untuk saya.

Joseleo
sumber
6
Pertanyaan ini telah dijawab secara luas lebih dari 8 tahun yang lalu. Pleae memastikan bahwa jawaban baru menambah informasi baru dan yang lebih penting bahkan benar.
Gerhardh