İnt, Int16, Int32 ve Int64 arasındaki fark nedir?


229

Arasındaki fark nedir int, System.Int16, System.Int32ve System.Int64onların başka ebatlarda?

Yanıtlar:


348

Her tamsayı türünün farklı bir depolama kapasitesi aralığı vardır

   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)

James Sutherland'ın cevabında belirttiği gibi :

intve Int32aslında eşanlamlıdır; intbiraz daha tanıdık görünecek,Int32 görünecek, 32 bitlik kodunuzu okuyanlara daha açık hale getirecektir. Ben sadece 'bir tamsayı' ihtiyacım nerede int kullanmak eğilimindedir, Int32nerede boyutu önemli (kriptografik kod, yapılar) böylece gelecekteki intkoruyucular uygun bir genişletmek güvenli olduğunu bilecek , ama Int32aynı şekilde değişen değişkenler dikkat .

Ortaya çıkan kod aynı olacaktır: fark tamamen okunabilirlik veya kod görünümündedir.


1
Değerin 65,535'i (imzalı) veya −32,768 ila 32,767'yi (imzasız) aşmayacağını biliyorsanız, tamsayı int16sadece kullanmak yerine bellek kaynağını kurtarmak için tanımlamak daha iyi olmaz mıydı int?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

8
int ve int32 eşanlamlı olabilir, ancak olmaları gerekmez. Günümüzde, satılan çoğu sistem 64 bittir, bu durumda int 64 bit olacaktır.
Martijn Otto

4
Matthew T. Baker ve benim gibi performans performansından hangisinin kullanılacağına karar vermeye çalışan diğerleri için, Integer'ın çoğu durumda Int16'dan daha verimli olduğunu gösteren bu
Tony L. 2

19
@MartijnOtto Soru C # olarak etiketlenmiştir. C # 'da, sistem ne olursa olsun int, daima Int32 . Belki de C ++ düşünüyorsunuz?

9
@MattBaker: Genel olarak, modern bilgisayarlarda, bir int16 bir int32 (ve aslında bir int64) kadar yer kaplar, çünkü çoğu işlemin verimli olması için, 32 veya 64 bit sınırlarına hizalanmış erişim sağlamak için verilerin etrafında dolaşırız (sırasıyla 32 veya 64 bit modlarında). Bunun nedeni, hizalanmamış erişimlerin bazı mimarilerde gülünç verimsiz olması ve diğerlerinde mümkün olmamasıdır.
Joel

118

Buradaki tek gerçek fark boyuttur. Buradaki tüm int türleri değişen boyutlarda işaretli tamsayı değerleridir

  • Int16: 2 bayt
  • Int32ve int: 4 bayt
  • Int64 : 8 bayt

Int64Geri kalanı arasında küçük bir fark vardır . 32 bitlik bir platformda bir Int64depolama konumuna atamaların atomik olacağı garanti edilmez. Diğer tüm tipler için garanti edilir.


Ben kullanırsanız Int64içinde 32 bit Windows Operating Systemo zaman ben çarptırılabilir konular nelerdir? Örnek var mı?
shaijut

70

int

C # 'da tanımlanan ilkel bir veri türüdür.

FCL tipi Int32 ile eşlenir.

Bir değer türüdür ve System.Int32 yapısını temsil eder.

İmzalı ve 32 bit sürüyor.

Minimum -2147483648 ve maksimum +2147483647 değerine sahiptir.

Int16

FCL türüdür.

C # 'da, kısa Int16 ile eşlenir.

Bir değer türüdür ve System.Int16 yapısını temsil eder.

İmzalı ve 16 bit sürüyor.

Minimum -32768 ve maksimum +32767 değerine sahiptir.

Int32

FCL türüdür.

C # 'da, int Int32 ile eşlenir.

Bir değer türüdür ve System.Int32 yapısını temsil eder.

İmzalı ve 32 bit sürüyor.

Minimum -2147483648 ve maksimum +2147483647 değerine sahiptir.

Int64

FCL türüdür.

C # 'da, uzun Int64 ile eşlenir.

Bir değer türüdür ve System.Int64 yapısını temsil eder.

İmzalı ve 64 bit sürüyor.

Minimum –9,223,372,036,854,775,808 ve maksimum 9,223,372,036,854,775,807 değerine sahiptir.


Sadece eklemek için Int64veri türü C # 'de iken veya soneki olmayan Lveya lsonek kullanılarak temsil edilebilir . Int16Int32
RBT

14

Jeffrey Framework'in (.NET framework geliştirmesine katkıda bulunanlardan biri) kitabının 'C # üzerinden CLR' kitabına göre:

int, C # derleyicisi tarafından izin verilen ilkel bir türken, Int32, Çerçeve Sınıf Kitaplığı türüdür (CLS'ye uyan diller arasında kullanılabilir). Aslında, int derleme sırasında Int32'ye çevirir.

Ayrıca,

C # 'da uzun System.Int64 ile eşleşir, ancak farklı bir programlama dilinde, Int16 veya Int32 ile eşlenebilir. Aslında, C ++ / CLI, Int32 kadar uzun tedavi eder.

Aslında, çoğu (.NET) dili bir anahtar kelime kadar uzun davranmaz ve onu kullanan kodu derlemez.

Bu yazarı ve FCL türlerini (yani Int32) dile özgü ilkel türlere (yani int) tercih eden .NET ile ilgili birçok standart literatürü, özellikle bu tür birlikte çalışabilirlik kaygılarıyla ilgili olarak gördüm.


8

Hiçbir şey değil. Türleri arasındaki tek fark olduğunu (ve dolayısıyla, temsil ettikleri değerler aralığı) boyutları.


8

16, 32 ve 64 tipleri hakkında çok önemli bir not:

bu sorguyu çalıştırırsanız ... Array.IndexOf (yeni Int16 [] {1,2,3}, 1)

sıfır (0) almanız gerekir, çünkü ... 1, 2 veya 3 dizisi içinde 1'dir. -1 olarak cevap alırsanız, 1, 1, 2 veya 3 dizisi içinde olmadığı anlamına gelir. .

Ne bulduğuma bakın: Aşağıdakilerin tümü size -1 değil 0 vermelidir (2.0, 3.0, 3.5, 4.0 tüm çerçeve sürümlerinde test ettim)

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)

Demek istediğim, Array.IndexOf karşılaştırmaları için sadece Int32'ye güven!


7
İlk örneğin neden bu şekilde çalıştığını açıklığa kavuşturmak için: ilk hazır bilgi 1, 2 ve 3 short, diziye sığacak şekilde dolaylı olarak dökülürken , ikinci hazır bilgi 1 sıradan olarak bırakılır int. (int)1eşit olarak kabul edilmez için (short)1, (short)2, (short)3, böylece sonuç -1.

4
C # sürümleri için benzer bir ayarlama olurdu, ancak FYI basit bir tür belirleyici bu sorunu giderir: Array.IndexOf(new Int16(){1,2,3}, 1S) Array.IndexOf(new Int32(){1,2,3}, 1I) Array.IndexOf(new Int64(){1,2,3}, 1L)hepsi beklendiği gibi çalışır.
Mark Hurd

1
Ve çalışmayanlar Object[],Objectaşırı yükü kullandılar . C # örtük yükselttiğini intbir etmek longgerektiğinde (ve aynı zamanda bir yükseltir shortbir etmek intya long) ama örtük kullanarak aşağı atmak olmaz objectyerine aşırı. İle Option Strict Onveya OffVB, sadece homojen tipler sağlandığında yazılan aşırı yükü kullanır, aksi takdirde objectaşırı yükü kullanır .
Mark Hurd

Cevabınız yanıltıcı. Kod, farklı türdeki değerleri karşılaştırıyor. Sonuç for Array.IndexOf comparisons, only trust Int32!yanlış. Son 1argümanı karşılık gelen Dizi türüne uygularsanız , beklendiği gibi çalışır.
Don Cheadle

Bu çok ilginç ve beklenmedik bir davranıştır (int uzun işlere ancak int kısa devre yapmaz) dolayısıyla upvote!
sth_Weird

7

DÜZENLEME: Bu, bu soruya cevap verdiğimde kaçırdığım bir etiket olan C # için doğru değil - C # 'a özgü daha fazla bir cevap varsa, lütfen bunun yerine oy verin!


Hepsi değişen boyutlarda tam sayıları temsil eder.

Ancak, çok küçük bir fark var.

int16, int32 ve int64'ün tümü sabit bir boyuta sahiptir.

İnt boyutu için derleme mimarisi bağlıdır - K dizilimde sadece daha büyük olarak int tanımlayan veya pratikte öyle işlemci Sen hedefleme, genişliği olsa bir kısa devreden eşit muhtemelen 32bit ama şunu bil ki olmayabilir.


1
Bu gerçekten doğru olan tek cevap olduğu için kabul edilen cevap olmalı
mjs

2
Hayır, bu C # için geçerli değil. AC # int her zaman 32 bit boyutundadır. C için, evet bu komplikasyonla uğraşmak zorunda kaldınız ve genellikle değişken int boyutlarıyla başa çıkmak için C kodunda makrolar görüyorsunuz. Bkz. Ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf sayfa 18.
Ananke

@Ananke Ahh, C # etiketini kaçırdı. Ben cevaplar bazı oylar geri dönmek isterdim .....
mjs 28:16

6
  1. intve int32bir ve aynıdır (32 bit tam sayı)
  2. int16 kısa int (2 bayt veya 16 bit)
  3. int64 uzun veri tipidir (8 bayt veya 64 bit)

2
int'in 32 bit olduğu garanti edilmez.
mjs

8
mjs, bu doğru değil. C # 'da int, bir takma addır Int32ve bu nedenle her zaman 32 bit olduğu garanti edilir.
David Arno

Aslında mjs'nin söylediği doğru, INT, x86 veya x64 sistemine dayalı bir tamsayı anlamına gelir, bu nedenle sisteminiz x64 ise, int Int64 olacaktır, bu nedenle 32 olması garanti edilmez. X32'ye int32 koyarsanız her zaman int32 olacaktır .
Yogurtu

5
Hayır, David Arno'nun söylediği doğru. C # dili özellikle 'int' değerini 32 bit tam sayı (Int32) olarak tanımlar. Diğer diller (C / C ++ vb.) Bunu belirtmeyebilir, ancak bu soru 'C #' olarak etiketlenmiştir.
Theo Brinkman

@TheoBrinkman Doğru, Microsoft'un C # s integral sayısal türlerindeki sayfası: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Max Barraclough

5

Her ikisi de gerçekten eşanlamlıdır, Ancak aralarındaki küçük farkı buldum,

1) kullanamazsınız Int32oluşturulurkenenum

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

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

2) Int32Sistem beyanı altındadır. kaldırırsanız using.Systemderleme hatası alırsınız, ancakint


-8

Int = Int32 -> Orijinal uzun tip

Int16 -> Orijinal int

Int64 -> 64 bit sistemlerden sonra yeni veri türü kullanılabilir

"int" yalnızca geriye dönük uyumluluk için kullanılabilir. Programlarımızı daha kesin hale getirmek için gerçekten yeni int türlerini kullanmalıyız.

---------------

Yol boyunca fark ettiğim bir şey dahaInt Int16, Int32 ve Int64'e benzer bir sınıf olmamasıdır . TryParseTamsayı gibi tüm yararlı işlevler gelir Int32.TryParse.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.