Seperti yang dikatakan AraK, antarmuka c ++ stream akan selalu bekerja dengan baik.
std :: size_t s = 1024; std :: cout << s; // atau aliran lain seperti stringstream!
Jika Anda menginginkan C stdio, tidak ada jawaban portabel untuk ini untuk kasus "portabel" tertentu. Dan itu menjadi jelek karena seperti yang Anda lihat, memilih format bendera yang salah dapat menghasilkan peringatan kompiler atau memberikan output yang salah.
C99 mencoba menyelesaikan masalah ini dengan format inttypes.h seperti "%" PRIdMAX "\ n". Tetapi seperti halnya dengan "% zu", tidak semua orang mendukung c99 (seperti MSVS sebelum 2013). Ada file "msinttypes.h" yang beredar untuk menangani hal ini.
Jika Anda menggunakan tipe yang berbeda, bergantung pada flag, Anda mungkin mendapatkan peringatan kompilator untuk pemotongan atau perubahan tanda. Jika Anda memilih rute ini, pilih jenis ukuran tetap relevan yang lebih besar. Salah satu dari "% llu" panjang dan "llu" panjang yang tidak ditandatangani atau panjang harus bekerja, tetapi llu juga dapat memperlambat hal-hal di dunia 32bit sebagai terlalu besar. (Sunting - mac saya mengeluarkan peringatan dalam 64 bit untuk% llu tidak cocok dengan size_t, meskipun% lu,% llu, dan size_t semuanya berukuran sama. Dan% lu dan% llu bukan ukuran yang sama pada MSVS2012 saya. Jadi Anda mungkin perlu menggunakan + menggunakan format yang cocok.)
Untuk itu, Anda bisa menggunakan jenis ukuran tetap, seperti int64_t. Tapi tunggu! Sekarang kita kembali ke c99 / c ++ 11, dan MSVS yang lebih lama gagal lagi. Plus Anda juga memiliki gips (mis. Map.size () bukan tipe ukuran tetap)!
Anda bisa menggunakan header atau pustaka pihak ke-3 seperti boost. Jika Anda belum menggunakannya, Anda mungkin tidak ingin mengembang proyek Anda seperti itu. Jika Anda ingin menambahkan satu hanya untuk masalah ini, mengapa tidak menggunakan c ++ stream, atau kompilasi bersyarat?
Jadi Anda turun ke c ++ stream, kompilasi bersyarat, kerangka kerja pihak ke-3, atau semacam portable yang kebetulan bekerja untuk Anda.
unsigned long
adalah pilihan terbaik jika implementasi libc Anda tidak mendukungz
pengubah; standar C99 merekomendasikansize_t
untuk tidak memiliki peringkat konversi integer yang lebih besar daripadalong
, jadi Anda cukup aman