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.

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?


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

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


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


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



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.


-5

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


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