Apa perbedaan antara int, Int16, Int32 dan Int64?

229

Apa perbedaan antara int, System.Int16, System.Int32dan System.Int64selain ukuran mereka?

Joby Kurian
sumber

Jawaban:

348

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 :

intdan Int32memang identik; intakan menjadi sedikit lebih familiar, Int32membuat 32-bitness lebih eksplisit bagi mereka yang membaca kode Anda. Saya akan cenderung menggunakan int di mana saya hanya perlu 'bilangan bulat', di Int32mana ukurannya penting (kode kriptografi, struktur) sehingga pengelola di masa depan akan tahu lebih aman untuk memperbesar intjika perlu, tetapi harus berhati-hati mengubah Int32variabel dengan cara yang sama .

Kode yang dihasilkan akan sama: perbedaannya adalah murni dari keterbacaan atau penampilan kode.

Komunitas
sumber
1
Jika Anda tahu nilainya tidak akan melebihi 65.535 (ditandatangani) atau −32.768 hingga 32.767 (tidak ditandatangani) bukankah lebih baik mendefinisikan bilangan bulat int16untuk menghemat sumber daya memori, dibandingkan dengan hanya menggunakan int?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
8
int dan int32 bisa bersinonim, tetapi tidak harus sama. Saat ini, sebagian besar sistem yang dijual adalah 64-bit dalam hal int akan menjadi 64 bit.
Martijn Otto
4
Untuk Matthew T. Baker dan orang lain seperti saya yang datang ke sini mencoba memutuskan mana yang akan digunakan dari sudut pandang kinerja, Anda harus memeriksa posting ini yang menunjukkan Integer lebih efisien daripada Int16 dalam banyak kasus: stackoverflow.com/questions/129023/ net-integer-vs-int16
Tony L.
19
@ MartijnOtto Pertanyaan ini ditandai C #. Dalam C #, intadalah selalu Int32 , terlepas dari sistem. Mungkin Anda berpikir tentang C ++?
9
@MattBaker: Secara umum, pada komputer modern, sebuah int16 mengambil ruang sebanyak int32 (dan sebenarnya sebuah int64) karena agar sebagian besar operasi menjadi efisien, kami membungkus data untuk membuat akses disesuaikan dengan batas 32 atau 64 bit. (masing-masing dalam mode 32 atau 64 bit). Ini karena akses yang tidak selaras sangat tidak efisien pada beberapa arsitektur, dan tidak mungkin pada yang lain.
Joel
118

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 byte
  • Int32dan int: 4 byte
  • Int64 : 8 byte

Ada satu perbedaan kecil antara Int64dan sisanya. Pada platform 32 bit, penugasan ke Int64lokasi penyimpanan tidak dijamin atom. Dijamin untuk semua jenis lainnya.

JaredPar
sumber
Jika saya menggunakan Int64di 32 bit Windows Operating Systemkemudian apa masalah aku bisa menghadapi? Apakah ada contoh?
shaijut
70

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.

Haris
sumber
Hanya untuk menambahkan bahwa Int64tipe data dapat direpresentasikan menggunakan Latau lsufiks sementara Int16atau Int32belum sufiks dalam C #.
RBT
14

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.

Praveen
sumber
8

Tidak ada. Satu-satunya perbedaan antara jenis adalah ukurannya (dan, karenanya, kisaran nilai yang dapat mereka wakili).

duskwuff -inactive-
sumber
8

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!

tno2007
sumber
7
Untuk memperjelas mengapa contoh pertama bekerja seperti itu: literal 1 pertama, 2, dan 3 secara implisit dilemparkan ke short agar sesuai dengan mereka dalam array, sedangkan literal 1 kedua dibiarkan seperti biasa int. (int)1tidak dianggap sama dengan (short)1, (short)2, (short)3, sehingga hasilnya adalah -1.
4
Akan ada penyesuaian serupa yang tersedia untuk versi C #, tetapi FYI tipe specifier sederhana memperbaiki masalah ini: 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.
Mark Hurd
1
Dan yang tidak berfungsi menggunakan Object[],Objectkelebihan beban. C # secara implisit menaikkan intke longsaat dibutuhkan (dan juga menaikkan shortke intatau long), tetapi tidak akan secara implisit dilemparkan ke bawah, menggunakan objectkelebihan beban sebagai gantinya. Dengan Option Strict Onatau OffVB hanya akan menggunakan overload yang diketik ketika disediakan tipe yang seragam, jika tidak menggunakan objectoverload.
Mark Hurd
Jawaban Anda menyesatkan. Kode ini membandingkan nilai dari berbagai jenis. Kesimpulannya for Array.IndexOf comparisons, only trust Int32!salah. Jika Anda melemparkan 1argumen terakhir ke tipe Array yang sesuai, itu berfungsi seperti yang diharapkan.
Don Cheadle
Ini adalah perilaku yang sangat menarik dan tidak terduga (karena int untuk pekerjaan yang lama tetapi pendek ke int tidak) maka hasilnya bagus!
sth_Weird
7

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.

dekanWombourne
sumber
1
Ini harus menjadi jawaban yang diterima karena ini adalah satu-satunya yang benar
mjs
2
Tidak, ini tidak benar untuk C #. AC # int selalu berukuran 32 bit. Untuk C, ya Anda harus berurusan dengan komplikasi ini dan Anda sering melihat makro dalam kode C untuk menangani ukuran int variabel. Lihat ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf halaman 18.
Ananke
@Ananke Ahh, melewatkan tag C #. Seandainya saya bisa mengembalikan beberapa suara pada jawaban .....
mjs
6
  1. intdan int32satu dan sama (integer 32-bit)
  2. int16 adalah int pendek (2 byte atau 16-bit)
  3. int64 adalah tipe data panjang (8 byte atau 64-bit)
Sunil Kumar BM
sumber
2
int tidak dijamin menjadi 32 bit.
mjs
8
@ mjs, ini tidak benar. Dalam C #, intadalah alias untuk Int32dan dengan demikian selalu dijamin menjadi 32 bit.
David Arno
Sebenarnya apa yang dikatakan mjs adalah benar, INT berarti integer yang didasarkan pada sistem x86 atau x64, jadi jika sistem Anda x64, int akan menjadi Int64, oleh karena itu tidak dijamin menjadi 32 .. Jika Anda memasukkan int32 ke dalam x64 akan selalu menjadi int32 .
Yogurtu
5
Tidak, apa yang dikatakan David Arno benar. Bahasa C # secara spesifik mendefinisikan 'int' yang berarti integer 32-bit (Int32). Bahasa lain (C / C ++, dll.) Mungkin tidak menentukan itu, tetapi pertanyaan ini ditandai 'C #'.
Theo Brinkman
@TheoBrinkman Benar, inilah halaman Microsoft tentang tipe numerik integral C #: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Max Barraclough
5

Mereka berdua memang identik, Namun saya menemukan perbedaan kecil di antara mereka,

1) Anda tidak dapat menggunakan Int32saat membuatenum

enum Test : Int32
{ XXX = 1   // gives you compilation error
}

enum Test : int
{ XXX = 1   // Works fine
}

2) Int32berada di bawah deklarasi Sistem. jika Anda menghapus using.SystemAnda akan mendapatkan kesalahan kompilasi tetapi tidak dalam kasus untukint

ini
sumber
-8

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 Intmirip dengan Int16, Int32 dan Int64. Semua fungsi bermanfaat seperti TryParseuntuk integer berasal Int32.TryParse.

Mahesh
sumber