Jaka jest różnica między int, Int16, Int32 i Int64?


229

Jaka jest różnica między int, System.Int16, System.Int32i System.Int64inne niż ich wielkości?

Odpowiedzi:


348

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 :

inti Int32rzeczywiś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.


1
Jeśli wiesz, że wartość nie będzie przekraczać 65 535 (podpisana) lub -32 768 do 32 767 (niepodpisana), czy nie lepiej byłoby zdefiniować liczbę całkowitą w int16celu zaoszczędzenia zasobów pamięci, zamiast zwykłego użycia int?
2 ʙᴀᴋᴇʀ

8
int i int32 mogą być synonimami, ale nie muszą. Obecnie większość sprzedawanych systemów jest 64-bitowych, w którym to przypadku int będzie wynosić 64 bity.
Martijn Otto

4
Matthew T. Baker i inni, tacy jak ja, którzy przybyli tutaj, próbując zdecydować, którego użyć z punktu widzenia wydajności, powinieneś sprawdzić ten post, który sugeruje, że Integer jest bardziej wydajny niż Int16 w wielu przypadkach: stackoverflow.com/questions/129023/ net-integer-vs-int16
Tony L.

19
@MartijnOtto Pytanie jest oznaczone jako C #. W języku C # intjest zawsze Int32 , niezależnie od systemu. Być może myślisz o C ++?

9
@MattBaker: Ogólnie rzecz biorąc, na nowoczesnych komputerach int16 zajmuje tyle samo miejsca, co int32 (a właściwie int64), ponieważ aby większość operacji była wydajna, otaczamy się danymi, aby uzyskać dostęp wyrównany do granic 32 lub 64 bitowych (odpowiednio w trybach 32 lub 64 bitowych). Wynika to z faktu, że niedopasowane dostępy są absurdalnie nieefektywne na niektórych architekturach, a na innych niemożliwe.
Joel

118

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 bajty
  • Int32i int: 4 bajty
  • Int64 : 8 bajtów

Jest 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.


Jeśli używam Int64w 32 bit Windows Operating Systemto jakie są problemy mogłem twarz? Czy jest jakiś przykład?
shaijut

70

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.


Wystarczy dodać, że ten Int64typ danych może być reprezentowany za pomocą Llub lsufiksu, podczas gdy Int16lub Int32nie ma sufiksu w języku C #.
RBT

14

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ą.


8

Nic. Jedyną różnicą między typami jest ich rozmiar (a zatem zakres wartości, które mogą reprezentować).


8

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!


7
Aby wyjaśnić, dlaczego pierwszy przykład działa w ten sposób: pierwszy literał 1, 2 i 3 są domyślnie rzutowane, 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.

4
Dostępna byłaby podobna korekta dla wersji C #, ale FYI prosty specyfikator typu rozwiązuje ten problem: 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.
Mark Hurd

1
A te, które nie działają, wykorzystały 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.
Mark Hurd

Twoja odpowiedź jest myląca. Kod porównuje wartości różnych typów. Wniosek 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.
Don Cheadle

Jest to bardzo interesujące i nieoczekiwane zachowanie (ponieważ int do długich działa, ale skrót do int nie), stąd opinia!
sth_Weird

7

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ć.


1
To powinna być zaakceptowana odpowiedź, ponieważ jest to jedyna prawdziwa odpowiedź
mjs

2
Nie, to nie dotyczy C #. AC # int ma zawsze rozmiar 32 bitów. W przypadku C tak, musiałeś sobie poradzić z tą komplikacją i często widzisz makra w kodzie C, aby radzić sobie ze zmiennymi rozmiarami całkowitymi. Zobacz ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf strona 18.
Ananke

@Ananke Ahh, brakowało znacznika C #. Chciałbym cofnąć niektóre głosy na odpowiedzi .....
mjs

6
  1. inti int32są takie same (32-bitowa liczba całkowita)
  2. int16 ma krótkie int (2 bajty lub 16 bitów)
  3. int64 jest długim typem danych (8 bajtów lub 64-bitów)

2
int nie ma gwarancji 32 bitów.
mjs

8
@ mjs, to po prostu nieprawda. W języku C # intjest aliasem Int32i dlatego zawsze ma gwarantowane 32 bity.
David Arno,

Właściwie to, co mjs mówi, jest poprawne, INT oznacza liczbę całkowitą opartą na systemie x86 lub x64, więc jeśli twój system to x64, int będzie Int64, dlatego nie ma gwarancji, że będzie to 32 .. Jeśli umieścisz int32 na x64, zawsze będzie int32 .
Yogurtu,

5
Nie, to, co mówi David Arno, jest poprawne. Język C # specjalnie definiuje „int”, oznaczający 32-bitową liczbę całkowitą (Int32). Inne języki (C / C ++ itp.) Mogą tego nie określać, ale pytanie to jest oznaczone jako „C #”.
Theo Brinkman

@TheoBrinkman Correct, oto strona Microsoftu na temat integralnych typów liczbowych C #: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Max Barraclough

5

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


-8

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.