Apakah sebagian besar pengembang aplikasi menggunakan bilangan bulat yang ditandatangani di tempat-tempat di mana mereka benar-benar bermaksud menggunakan bilangan bulat yang tidak ditandatangani? Saya melakukannya sepanjang waktu, begitu juga rekan kerja saya. Saya belum melihat banyak basis kode luas lainnya (selain Delphi VCL) dan contoh di internet biasanya menggunakan integer. Sedangkan pengembang VCL menggunakan tipe data mereka sendiri (yang akan menjadi cara yang paling tidak malas untuk mendeklarasikan variabel).
Sesuatu sepertinya sedikit mengerikan tentang kode seperti ini
TStuffRec = record
recordID : Integer;
thingID : Integer;
otherThingID : Integer;
end;
ketika itu bisa ditulis sebagai
TStuffRec = record
recordID : Cardinal;
thingID : Cardinal;
otherThingID : Cardinal;
end;
Secara fungsional, catatan ini hampir selalu berfungsi sama (dan mudah-mudahan akan terus bekerja sama bahkan dalam Delphi 64-bit). Tetapi jumlah yang sangat besar akan memiliki masalah konversi.
Tapi ada juga kelemahan menggunakan int unsigned. Terutama berasal dari betapa menyebalkannya mencampur keduanya.
Pertanyaan sebenarnya adalah, apakah ini hal yang benar-benar dipikirkan atau dimasukkan dalam praktik terbaik? Apakah biasanya hanya tergantung pengembang?
sumber
Jawaban:
Salah satu alasan mengapa saya tidak menggunakan tipe integer yang tidak ditandai terlalu banyak di Delphi adalah bahwa mereka dapat membuat masalah ketika dicampur dengan integer yang ditandatangani. Inilah yang menggigit saya sekali:
Saya telah
i
menyatakan sebagai bilangan bulat yang tidak ditandatangani, (setelah semua, ini adalah indeks ke dalam daftar yang dimulai dari 0, tidak pernah harus negatif, kan?), Tetapi ketikaList.Count
0, itu tidak akan hubungan pendek loop seperti yang diharapkan karena0 - 1
mengevaluasi ke angka positif yang sangat tinggi. Ups!Antara potensi masalah keselamatan yang melekat dalam pencampuran bilangan bulat bertanda tangan dan tidak bertanda, dan masalah jangkauan, (jika Anda akan membutuhkan bilangan positif lebih besar dari
high(signed whatever)
, kemungkinan besar Anda juga akan membutuhkan bilangan positif lebih besar darihigh(unsigned whatever)
itu, jadi bergeraklah hingga ukuran yang lebih besar berikutnya alih-alih beralih dari ditandatangani menjadi unsigned dengan ukuran yang sama biasanya merupakan tindakan yang benar,) Saya benar-benar belum menemukan terlalu banyak kegunaan untuk integer unsigned ketika mewakili sebagian besar data.sumber
Sejujurnya saya cenderung menggunakan Integer berdasarkan kebiasaan. Saya terbiasa bahwa mereka menawarkan rentang yang cukup besar untuk sebagian besar situasi dan memungkinkan nilai negatif (seperti -1). Memang, banyak kali menggunakan bytes / word / shortint akan lebih tepat. Sekarang memikirkannya, saya bisa fokus pada titik-titik ini:
Perspektif. Ukuran Tilemap terbatas pada 192x192 ubin, jadi saya bisa menggunakan byte untuk menangani ubin dan loop. Tetapi jika ukuran peta harus ditingkatkan, saya harus melalui setiap penggunaan dan menggantinya dengan kata misalnya. Ketika saya perlu mengizinkan objek off-peta saya harus pergi lagi untuk mengubah ke smallint.
Loop. Seringkali saya menulis loop "dari i: = 0 ke Count-1", apa yang terjadi jika "i" adalah byte dan Count = 0 adalah loop berjalan dari 0 hingga 255. Bukannya saya menginginkannya.
Seragam. Lebih mudah untuk mengingat dan menerapkan "var i: integer;" daripada berhenti di setiap kasus dan berpikir "Hm .. di sini kita berurusan dengan kisaran 0..120 .. byte .. tidak, tunggu, kita mungkin perlu -1 untuk tidak diinisialisasi .. shortint .. tunggu .. bagaimana jika 128 adalah tidak cukup .. Arrgh! " atau "Mengapa kecil di tempat ini, bukan jalan pendek?"
Menggabungkan. Ketika saya perlu menggabungkan dua atau lebih kelas bersama-sama mereka mungkin menggunakan tipe data yang berbeda untuk tujuan mereka, menggunakan tipe yang lebih luas memungkinkan untuk melewati konversi yang tidak perlu.
-1. Bahkan ketika nilai berada pada kisaran 0..n-1 saya sering perlu menetapkan nilai "tidak ada nilai / tidak diketahui / tidak diinisialisasi / kosong", yang merupakan praktik umum -1.
Menggunakan Integer memungkinkan untuk melewati semua masalah ini, lupakan optimasi tingkat rendah di mana tidak diperlukan, naik ke level yang lebih tinggi dan fokus pada masalah yang lebih nyata.
PS Kapan saya menggunakan tipe lain?
sumber
Praktik terbaik adalah menggunakan tipe data yang sesuai dengan kebutuhan untuk data yang digunakan (data yang diharapkan).
Contoh C #: Jika saya hanya perlu mendukung 0 hingga 255, saya akan menggunakan byte.
Jika saya perlu mendukung 1.000.000 negatif dan positif, maka int.
Lebih besar dari 4,2 miliar, lalu gunakan yang lama.
Dengan memilih jenis yang benar, program akan menggunakan jumlah memori yang optimal serta berbagai jenis menggunakan jumlah memori yang berbeda.
Berikut ini adalah referensi C # int dari MSDN.
sumber
Integer
datatype adalah 32 bit pada mesin 32-bit dan tampaknya akan 64 bit pada mesin 64-bit.int
hanyalah singkatan untukSystem.Int32
, tidak peduli mesin apa kode berjalan.type int System.Int32
atau sesuatu untuk efek itu? Mungkinkah itu diubah dengan mudah di versi kerangka kerja yang akan datang?uint
adalah salah satu dari jenis yang tidak patuh yang artinya tidak boleh digunakan dalam API terbuka untuk menghindari melanggar kemampuan untuk menggunakan API itu dalam bahasa .NET selain dari yang ditulis pustaka. Ini juga mengapa kerangka .NET API sendiri menggunakan diint
manauint
akan dilakukan.Jenis integer yang tidak ditandai hanya boleh digunakan untuk mewakili nomor kardinal dalam bahasa yang mewakili nomor kardinal. Karena cara komputer yang menjalankan C bekerja, tipe integer yang tidak bertanda berperilaku sebagai anggota cincin aljabar mod-2 (artinya perhitungan yang meluap akan "membungkus" dapat diprediksi), dan bahasa tersebut menentukan bahwa dalam banyak kasus jenis tersebut adalah diperlukan untuk berperilaku sebagai cincin aljabar abstrak bahkan ketika perilaku seperti itu tidak konsisten dengan perilaku bilangan kardinal atau bilangan bulat matematika.
Jika sebuah platform sepenuhnya mendukung tipe terpisah untuk nomor kardinal dan cincin aljabar, maka saya menyarankan agar nomor kardinal harus diproses menggunakan tipe nomor kardinal (dan hal-hal yang perlu dibungkus menggunakan jenis cincin). Tidak hanya tipe seperti itu dapat menyimpan angka dua kali lipat dari tipe yang ditandatangani, tetapi metode yang menerima parameter dari tipe seperti itu tidak perlu memeriksa apakah itu negatif.
Namun, mengingat relatif kurangnya jenis-jenis nomor kardinal, biasanya yang terbaik adalah menggunakan bilangan bulat untuk mewakili bilangan bulat matematika dan angka-angka kardinal.
sumber