Arasındaki fark nedir int, System.Int16, System.Int32ve System.Int64onların başka ebatlarda?
Arasındaki fark nedir int, System.Int16, System.Int32ve System.Int64onların başka ebatlarda?
Yanıtlar:
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 :
intveInt32aslında eşanlamlıdır;intbiraz daha tanıdık görünecek,Int32gö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 gelecektekiintkoruyucular uygun bir genişletmek güvenli olduğunu bilecek , amaInt32aynı şekilde değişen değişkenler dikkat .Ortaya çıkan kod aynı olacaktır: fark tamamen okunabilirlik veya kod görünümündedir.
int, daima Int32 . Belki de C ++ düşünüyorsunuz?
Buradaki tek gerçek fark boyuttur. Buradaki tüm int türleri değişen boyutlarda işaretli tamsayı değerleridir
Int16: 2 baytInt32ve int: 4 baytInt64 : 8 baytInt64Geri 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.
Int64içinde 32 bit Windows Operating Systemo zaman ben çarptırılabilir konular nelerdir? Örnek var mı?
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.
Int64veri türü C # 'de iken veya soneki olmayan Lveya lsonek kullanılarak temsil edilebilir . Int16Int32
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.
Hiçbir şey değil. Türleri arasındaki tek fark olduğunu (ve dolayısıyla, temsil ettikleri değerler aralığı) boyutları.
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!
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.
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.
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 .
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.
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.
intve int32bir ve aynıdır (32 bit tam sayı)int16 kısa int (2 bayt veya 16 bit)int64 uzun veri tipidir (8 bayt veya 64 bit)int, bir takma addır Int32ve bu nedenle her zaman 32 bit olduğu garanti edilir.
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
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.
int16sadece kullanmak yerine bellek kaynağını kurtarmak için tanımlamak daha iyi olmaz mıydıint?