Jaka jest różnica między int, System.Int16, System.Int32i System.Int64inne niż ich wielkości?
Jaka jest różnica między int, System.Int16, System.Int32i System.Int64inne niż ich wielkości?
Odpowiedzi:
Każdy typ liczb całkowitych ma inny zakres pojemności pamięci
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)
Jak stwierdził James Sutherland w swojej odpowiedzi :
intiInt32rzeczywiście są synonimami;intbędzie nieco bardziej znajomy,Int32sprawi , że 32-bitowość będzie bardziej wyraźna dla osób czytających Twój kod. Byłbym skłonny użyć int tam, gdzie potrzebuję tylko „liczby całkowitej”,Int32gdzie rozmiar jest ważny (kod kryptograficzny, struktury), aby przyszli opiekunowie wiedzieli, że bezpieczne jest powiększenie,intjeśli to właściwe, ale powinni dbać o zmianęInt32zmiennych w ten sam sposób .Wynikowy kod będzie identyczny: różnica polega wyłącznie na czytelności lub wyglądzie kodu.
intjest zawsze Int32 , niezależnie od systemu. Być może myślisz o C ++?
Jedyną prawdziwą różnicą jest tutaj rozmiar. Wszystkie typy int są tutaj wartościami całkowitymi ze znakiem, które mają różne rozmiary
Int16: 2 bajtyInt32i int: 4 bajtyInt64 : 8 bajtówJest jedna niewielka różnica między Int64resztą. Na 32-bitowej platformie przypisania do Int64miejsca przechowywania nie są gwarantowane jako atomowe. Jest gwarantowany dla wszystkich innych typów.
Int64w 32 bit Windows Operating Systemto jakie są problemy mogłem twarz? Czy jest jakiś przykład?
int
Jest to prymitywny typ danych zdefiniowany w języku C #.
Jest odwzorowany na Int32 typu FCL.
Jest to typ wartości i reprezentuje strukturę System.Int32.
Jest podpisany i zajmuje 32 bity.
Ma minimalną wartość -2147483648 i maksymalną wartość +2147483647.
Int16
Jest to typ FCL.
W języku C # skrót jest mapowany na Int16.
Jest to typ wartości i reprezentuje strukturę System.Int16.
Jest podpisany i zajmuje 16 bitów.
Ma minimalną wartość -32768 i maksymalną wartość +32767.
Int32
Jest to typ FCL.
W języku C # int jest mapowany na Int32.
Jest to typ wartości i reprezentuje strukturę System.Int32.
Jest podpisany i zajmuje 32 bity.
Ma minimalną wartość -2147483648 i maksymalną wartość +2147483647.
Int64
Jest to typ FCL.
W języku C # długie jest mapowane na Int64.
Jest to typ wartości i reprezentuje strukturę System.Int64.
Jest podpisany i zajmuje 64 bity.
Ma minimalną wartość -9 223 372 036 854 775 808 i maksymalną wartość 9 223 372,036,854,775,807.
Int64typ danych może być reprezentowany za pomocą Llub lsufiksu, podczas gdy Int16lub Int32nie ma sufiksu w języku C #.
Według Jeffreya Richtera (jednego z autorów opracowania .NET Framework) książka „CLR via C #”:
int jest prymitywnym typem dozwolonym przez kompilator C #, podczas gdy Int32 to typ biblioteki klas frameworka (dostępny we wszystkich językach zgodnych z CLS). W rzeczywistości int tłumaczy się na Int32 podczas kompilacji.
Również,
W języku C # długie mapy do System.Int64, ale w innym języku programowania, długie mogą być mapowane na Int16 lub Int32. W rzeczywistości C ++ / CLI traktuje długo jak Int32.
W rzeczywistości większość języków (.NET) nawet nie traktuje długo jako słowa kluczowego i nie skompiluje kodu, który go używa.
Widziałem tego autora i wiele standardowych piśmiennictwa na temat .NET preferujących typy FCL (tj. Int32) od typów pierwotnych specyficznych dla języka (tj. Int), głównie na temat takich problemów związanych z interoperacyjnością.
Nic. Jedyną różnicą między typami jest ich rozmiar (a zatem zakres wartości, które mogą reprezentować).
Bardzo ważna uwaga na temat typów 16, 32 i 64:
jeśli uruchomisz to zapytanie ... Array.IndexOf (nowy Int16 [] {1,2,3}, 1)
masz otrzymać zero (0), ponieważ pytasz ... jest 1 w tablicy 1, 2 lub 3. jeśli otrzymasz -1 jako odpowiedź, oznacza to, że 1 nie znajduje się w tablicy 1, 2 lub 3 .
Sprawdź, co znalazłem: Wszystkie poniższe powinny dać ci 0, a nie -1 (przetestowałem to we wszystkich wersjach środowiska 2.0, 3.0, 3.5, 4.0)
DO#:
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)
Chodzi mi o to, że w przypadku porównań Array.IndexOf zaufaj tylko Int32!
shortaby dopasować je do tablicy, podczas gdy drugi literał 1 jest pozostawiony jako zwykły int. (int)1nie uważa się za równą (short)1, (short)2, (short)3, a tym samym wynik wynosi -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)wszystkie działają zgodnie z oczekiwaniami.
Object[],Objectprzeciążenie. C # domyślnie podnosi wartość intdo a, longgdy jest to potrzebne (a także podnosi wartość shortdo a intlub long), ale nie będzie domyślnie odrzucany, objectzamiast tego użyje przeciążenia. Za pomocą Option Strict Onlub OffVB użyje przeciążenia maszynowego tylko pod warunkiem, że jest to typ jednolity, w przeciwnym razie używa objectprzeciążenia.
for Array.IndexOf comparisons, only trust Int32!jest błędny. Jeśli rzutujesz ostatni 1argument na odpowiedni typ macierzy, działa on zgodnie z oczekiwaniami.
EDYCJA: Nie jest to do końca prawdą w przypadku C #, tagu, który przeoczyłem, gdy odpowiedziałem na to pytanie - jeśli jest odpowiedź bardziej specyficzna dla C #, proszę głosować na to!
Wszystkie reprezentują liczby całkowite o różnych rozmiarach.
Jest jednak bardzo mała różnica.
int16, int32 i int64 mają stały rozmiar.
Rozmiar int zależy od architektury, dla której się kompilujesz - specyfikacja C definiuje int jako większy lub równy krótkiemu, choć w praktyce jest to szerokość procesora, na który celujesz, prawdopodobnie 32-bitowy, ale powinieneś wiedzieć że może nie być.
inti int32są takie same (32-bitowa liczba całkowita)int16 ma krótkie int (2 bajty lub 16 bitów)int64 jest długim typem danych (8 bajtów lub 64-bitów)intjest aliasem Int32i dlatego zawsze ma gwarantowane 32 bity.
Oba są rzeczywiście synonimami, jednak znalazłem między nimi niewielką różnicę,
1) Nie możesz używać Int32podczas tworzeniaenum
enum Test : Int32
{ XXX = 1 // gives you compilation error
}
enum Test : int
{ XXX = 1 // Works fine
}
2) Int32podlega deklaracji systemowej. jeśli usuniesz using.System, pojawi się błąd kompilacji, ale nie na wypadekint
Int = Int32 -> Oryginalny długi typ
Int16 -> Original int
Int64 -> Nowy typ danych staje się dostępny po systemach 64-bitowych
„int” jest dostępne tylko dla kompatybilności wstecznej. Powinniśmy naprawdę używać nowych typów int, aby nasze programy były bardziej precyzyjne.
---------------
Jeszcze jedną rzeczą, którą zauważyłem po drodze, jest brak klasy o nazwie Intpodobnej do Int16, Int32 i Int64. Wszystkie przydatne funkcje, takie jak TryParseliczba całkowita, pochodzą Int32.TryParse.
int16celu zaoszczędzenia zasobów pamięci, zamiast zwykłego użyciaint?