Apa perbedaan antara int
, System.Int16
, System.Int32
dan System.Int64
selain ukuran mereka?
Apa perbedaan antara int
, System.Int16
, System.Int32
dan System.Int64
selain ukuran mereka?
Jawaban:
Setiap jenis integer memiliki kisaran kapasitas penyimpanan yang berbeda
Type Capacity
Int16 -- (-32,768 to +32,767)
Int32 -- (-2,147,483,648 to +2,147,483,647)
Int64 -- (-9,223,372,036,854,775,808 to +9,223,372,036,854,775,807)
Seperti yang dikatakan oleh James Sutherland dalam jawabannya :
int
danInt32
memang identik;int
akan menjadi sedikit lebih familiar,Int32
membuat 32-bitness lebih eksplisit bagi mereka yang membaca kode Anda. Saya akan cenderung menggunakan int di mana saya hanya perlu 'bilangan bulat', diInt32
mana ukurannya penting (kode kriptografi, struktur) sehingga pengelola di masa depan akan tahu lebih aman untuk memperbesarint
jika perlu, tetapi harus berhati-hati mengubahInt32
variabel dengan cara yang sama .Kode yang dihasilkan akan sama: perbedaannya adalah murni dari keterbacaan atau penampilan kode.
int
adalah selalu Int32
, terlepas dari sistem. Mungkin Anda berpikir tentang C ++?
Satu-satunya perbedaan nyata di sini adalah ukuran. Semua tipe int di sini adalah nilai integer yang ditandatangani yang memiliki ukuran berbeda-beda
Int16
: 2 byteInt32
dan int
: 4 byteInt64
: 8 byteAda satu perbedaan kecil antara Int64
dan sisanya. Pada platform 32 bit, penugasan ke Int64
lokasi penyimpanan tidak dijamin atom. Dijamin untuk semua jenis lainnya.
Int64
di 32 bit Windows Operating System
kemudian apa masalah aku bisa menghadapi? Apakah ada contoh?
int
Ini adalah tipe data primitif yang didefinisikan dalam C #.
Itu dipetakan ke Int32 tipe FCL.
Ini adalah tipe nilai dan mewakili struct System.Int32.
Itu ditandatangani dan membutuhkan 32 bit.
Ini memiliki nilai minimum -2147483648 dan maksimum +2147483647.
Int16
Ini adalah tipe FCL.
Dalam C #, pendek dipetakan ke Int16.
Ini adalah tipe nilai dan mewakili System.Int16 struct.
Itu ditandatangani dan membutuhkan 16 bit.
Ini memiliki minimum -32768 dan nilai maksimum +32767.
Int32
Ini adalah tipe FCL.
Di C #, int dipetakan ke Int32.
Ini adalah tipe nilai dan mewakili struct System.Int32.
Itu ditandatangani dan membutuhkan 32 bit.
Ini memiliki nilai minimum -2147483648 dan maksimum +2147483647.
Int64
Ini adalah tipe FCL.
Dalam C #, lama dipetakan ke Int64.
Ini adalah tipe nilai dan mewakili struct System.Int64.
Itu ditandatangani dan membutuhkan 64 bit.
Memiliki nilai minimum –9.223.372.036.854.775.808 dan maksimum 9.223.372.036.854.775.780.
Int64
tipe data dapat direpresentasikan menggunakan L
atau l
sufiks sementara Int16
atau Int32
belum sufiks dalam C #.
Menurut Jeffrey Richter (salah satu kontributor pengembangan .NET framework) buku 'CLR via C #':
int adalah tipe primitif yang diizinkan oleh kompiler C #, sedangkan Int32 adalah tipe Library Class Framework (tersedia lintas bahasa yang mematuhi CLS). Faktanya, int menerjemahkan ke Int32 selama kompilasi.
Juga,
Dalam C #, peta panjang ke System.Int64, tetapi dalam bahasa pemrograman yang berbeda, panjang bisa memetakan ke Int16 atau Int32. Bahkan, C ++ / CLI memperlakukan selama Int32.
Bahkan, sebagian besar (.NET) bahasa bahkan tidak akan memperlakukan lama sebagai kata kunci dan tidak akan mengkompilasi kode yang menggunakannya.
Saya telah melihat penulis ini, dan banyak literatur standar tentang .NET lebih memilih tipe FCL (yaitu, Int32) daripada tipe primitif spesifik bahasa (yaitu int), terutama pada masalah interoperabilitas.
Tidak ada. Satu-satunya perbedaan antara jenis adalah ukurannya (dan, karenanya, kisaran nilai yang dapat mereka wakili).
Catatan yang sangat penting pada 16, 32 dan 64 jenis:
jika Anda menjalankan kueri ini ... Array.IndexOf (Int16 baru [] {1,2,3}, 1)
Anda seharusnya mendapatkan nol (0) karena Anda bertanya ... adalah 1 dalam array 1, 2 atau 3. jika Anda mendapatkan -1 sebagai jawaban, itu berarti 1 tidak dalam array 1, 2 atau 3 .
Lihat apa yang saya temukan: Semua yang berikut ini harus memberi Anda 0 dan bukan -1 (Saya sudah menguji ini di semua versi kerangka 2.0, 3.0, 3.5, 4.0)
C #:
Array.IndexOf(new Int16[]{1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32[]{1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64[]{1,2,3}, 1) = 0 (correct)
VB.NET:
Array.IndexOf(new Int16(){1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32(){1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64(){1,2,3}, 1) = -1 (not correct)
Jadi poin saya adalah, untuk perbandingan Array.IndexOf, hanya percaya Int32!
short
agar sesuai dengan mereka dalam array, sedangkan literal 1 kedua dibiarkan seperti biasa int
. (int)1
tidak dianggap sama dengan (short)1
, (short)2
, (short)3
, sehingga hasilnya adalah -1.
Array.IndexOf(new Int16(){1,2,3}, 1S)
Array.IndexOf(new Int32(){1,2,3}, 1I)
Array.IndexOf(new Int64(){1,2,3}, 1L)
semua berfungsi seperti yang diharapkan.
Object[],Object
kelebihan beban. C # secara implisit menaikkan int
ke long
saat dibutuhkan (dan juga menaikkan short
ke int
atau long
), tetapi tidak akan secara implisit dilemparkan ke bawah, menggunakan object
kelebihan beban sebagai gantinya. Dengan Option Strict On
atau Off
VB hanya akan menggunakan overload yang diketik ketika disediakan tipe yang seragam, jika tidak menggunakan object
overload.
for Array.IndexOf comparisons, only trust Int32!
salah. Jika Anda melemparkan 1
argumen terakhir ke tipe Array yang sesuai, itu berfungsi seperti yang diharapkan.
EDIT: Ini tidak sepenuhnya benar untuk C #, sebuah tag yang saya lewatkan ketika saya menjawab pertanyaan ini - jika ada jawaban yang lebih spesifik C #, silakan pilih itu!
Mereka semua mewakili bilangan bulat dari berbagai ukuran.
Namun, ada perbedaan yang sangat kecil.
int16, int32 dan int64 semuanya memiliki ukuran yang tetap .
Ukuran int tergantung pada arsitektur yang Anda kompilasi - spesifikasi C hanya mendefinisikan int sebagai lebih besar atau sama dengan pendek meskipun dalam prakteknya itu adalah lebar prosesor yang Anda targetkan, yang mungkin 32bit tetapi Anda harus tahu bahwa mungkin tidak.
int
dan int32
satu dan sama (integer 32-bit)int16
adalah int pendek (2 byte atau 16-bit)int64
adalah tipe data panjang (8 byte atau 64-bit)int
adalah alias untuk Int32
dan dengan demikian selalu dijamin menjadi 32 bit.
Mereka berdua memang identik, Namun saya menemukan perbedaan kecil di antara mereka,
1) Anda tidak dapat menggunakan Int32
saat membuatenum
enum Test : Int32
{ XXX = 1 // gives you compilation error
}
enum Test : int
{ XXX = 1 // Works fine
}
2) Int32
berada di bawah deklarasi Sistem. jika Anda menghapus using.System
Anda akan mendapatkan kesalahan kompilasi tetapi tidak dalam kasus untukint
Int = Int32 -> Tipe panjang asli
Int16 -> Int asli
Int64 -> tipe data baru tersedia setelah sistem 64 bit
"int" hanya tersedia untuk kompatibilitas ke belakang. Kita harus benar-benar menggunakan tipe int baru untuk membuat program kita lebih tepat.
---------------
Satu hal lagi yang saya perhatikan di sepanjang jalan adalah tidak ada kelas bernama Int
mirip dengan Int16, Int32 dan Int64. Semua fungsi bermanfaat seperti TryParse
untuk integer berasal Int32.TryParse
.
int16
untuk menghemat sumber daya memori, dibandingkan dengan hanya menggunakanint
?