Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Memilih Jenis Integer yang Sesuai dalam C dan C++

Memilih Jenis Integer yang Sesuai dalam C dan C++

DDD
DDDasal
2024-09-13 10:15:06287semak imbas

Choosing an Appropriate Integer Type in C and C++

pengenalan

Apabila Dennis Ritchie mencipta C, dia menjadikan int (jenis integer bertanda) sebagai jenis lalai. saiz (bilangan bit) int sengaja tidak dinyatakan. Walaupun apabila C diseragamkan, semua yang dijamin ialah saiz minimum. Rasionalnya ialah saiz int mestilah saiz perkataan "semulajadi" untuk integer pada CPU tertentu.

Jika anda hanya memerlukan integer bertanda yang lebih kecil dan ingin menjimatkan sedikit ruang, Ritchie memberi kami ringkasan; atau, jika anda memerlukan integer yang lebih besar, dia memberi kami panjang. (C99 memberi kami integer yang lebih besar dengan panjang yang panjang.) Jika anda hanya memerlukan integer yang tidak ditandatangani, anda boleh memasukkan yang tidak ditandatangani dalam pengisytiharan. C99 juga memberi kami alias jenis integer bertanda bersaiz khusus (mis., int32_t) dan alias jenis tidak bertandatangan (mis., uint32_t).

Walau bagaimanapun, dalam pengaturcaraan, integer negatif (dengan itu memerlukan jenis integer yang ditandatangani), tidak diperlukan pada kebanyakan masa. Panjang rentetan, kiraan objek, saiz objek, saiz fail, dsb., semuanya adalah integer yang tidak ditandatangani. Alias ​​jenis bersaiz khusus diperlukan walaupun kurang daripada integer yang ditandatangani.

Namun saya telah melihat banyak kod yang menggunakan jenis integer secara tidak sesuai. Kod sedemikian boleh menyampaikan sama ada maklumat yang kurang dinyatakan atau mengelirukan kepada pembaca (termasuk diri anda dalam masa beberapa bulan). Sebaiknya pilih jenis integer yang betul untuk tujuan yang betul.

Garis panduan

Berikut ialah garis panduan saya untuk memilih jenis integer:

  • Apabila mewakili kiraan bait dalam ingatan, gunakan alias jenis standard size_t.

Ini ialah jenis yang digunakan oleh kedua-dua pustaka standard C dan C++, cth., oleh memcpy(), strlen(), std::string::size(), dsb., jadi terdapat banyak preseden.

  • Apabila mewakili sama ada saiz atau kedudukan dalam fail pada cakera, gunakan alias jenis POSIX off_t.

Jika anda berurusan dengan sangat fail besar, pada sesetengah platform, anda mungkin perlu menyusun dengan -D_FILE_OFFSET_BITS=64 untuk mendapatkan versi 64-bit off_t.

  • Apabila mewakili kiraan objek dalam ingatan, gunakan saiz_t juga.

Ini juga jenis yang digunakan oleh kedua-dua perpustakaan standard C dan C++, cth., oleh fread() dan fwrite().

  • Hanya jika anda perlu mewakili nilai yang terkandung dalam bilangan bit tertentu atau anda perlu mematuhi API tertentu, gunakan salah satu alias jenis int8_t, int16_t, int32_t atau int64_t untuk jenis yang ditandatangani; atau salah satu alias jenis uint8_t, uint16_t, uint32_t atau uint64_t untuk jenis yang tidak ditandatangani.

Satu-satunya masa anda biasanya perlu integer bersaiz tetap ialah apabila anda "mengeluarkan" nilai, cth., menulisnya ke cakera atau menghantarnya melalui soket.

Menggunakan integer bersaiz tetap apabila anda sebenarnya tidak memerlukan bilangan bit tertentu menyampaikan maklumat yang salah kepada pembaca.

Tambahan pula:

  • Apabila mewakili nilai integer yang mesti menjadi saiz tepat penunjuk, gunakan sama ada alias jenis intptr_t atau uintptr_t standard.

  • Hanya jika anda memerlukan nilai negatif, gunakan salah satu nilai pendek, int, panjang atau panjang panjang dengan int diutamakan melainkan anda memerlukan nilai yang lebih kecil atau lebih besar.

Akhir sekali:

  • Jika tidak, gunakan salah satu yang tidak ditandatangani pendek, tidak ditandatangani, tidak ditandatangani panjang atau panjang tidak ditandatangani begitu juga dengan tidak ditandatangani diutamakan melainkan anda memerlukan nilai yang lebih kecil atau lebih besar.

Iaitu, melainkan anda berurusan dengan salah satu daripada kes yang disenaraikan di atas, lalai menggunakan jenis yang tidak ditandatangani.

Kesimpulan

Memilih jenis integer yang betul menyampaikan maklumat yang betul kepada pembaca dan boleh menghapuskan semakan masa jalan.

Epilog

Pada asalnya, dan sehingga C99, int ialah jenis tersirat, iaitu jika anda tidak menyatakan sebarang jenis sama sekali, ia difahamkan sebagai int. Contohnya:

power( x, n )  /* x and n are int; returns int */
{
    int p;
    for ( p = 1; n > 0; --n )
        p *= x;
    return p;
}

mentakrifkan fungsi yang mempunyai parameter int dan mengembalikan int, namun int tidak digunakan dalam pengisytiharan.

Prototaip fungsi telah dialihkan kembali daripada C++ ke C89, namun takrifan fungsi "gaya K&R" asal masih dibenarkan sehingga C23. Jawatankuasa ANSI C ialah kumpulan konservatif.

Lebih pelik lagi, pra-C99 juga membenarkan int tersirat dalam pengisytiharan seperti:

i;      // int i
*p;     // int *p
*a[4];  // int *a[4]
*f();   // int *f()

Nasib baik, pengisytiharan sebegitu telah lama menyalahi undang-undang.

Atas ialah kandungan terperinci Memilih Jenis Integer yang Sesuai dalam C dan C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:ErfanOSArtikel seterusnya:ErfanOS