Was ist der Unterschied zwischen int, Int16, Int32 und Int64?

229

Was ist der Unterschied zwischen int, System.Int16, System.Int32und System.Int64anders als ihre Größen?

Joby Kurian
quelle

Antworten:

348

Jeder Integer-Typ hat einen anderen Speicherkapazitätsbereich

   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)

Wie von James Sutherland in seiner Antwort angegeben :

intund Int32sind in der Tat auch; intwird ein wenig vertrauter aussehen, Int32macht die 32-Bit für diejenigen, die Ihren Code lesen, expliziter. Ich würde gerne int verwenden, wenn ich nur 'eine Ganzzahl' benötige, Int32wo die Größe wichtig ist (kryptografischer Code, Strukturen), damit zukünftige Betreuer wissen, dass es sicher ist, eine intgegebenenfalls zu vergrößern , aber darauf achten sollten, Int32Variablen auf die gleiche Weise zu ändern .

Der resultierende Code ist identisch: Der Unterschied besteht lediglich in der Lesbarkeit oder dem Erscheinungsbild des Codes.

Gemeinschaft
quelle
1
Wenn Sie wissen, dass der Wert 65.535 (vorzeichenlos) oder -32.768 bis 32.767 (vorzeichenlos) nicht überschreiten wird, ist es nicht besser, die Ganzzahl zu definieren int16, um Speicherressourcen zu sparen, anstatt sie einfach zu verwenden int?
2 ʙᴀᴋᴇʀ
8
int und int32 können synonym sein, müssen es aber nicht. Heutzutage sind die meisten verkauften Systeme 64-Bit. In diesem Fall ist ein int 64-Bit.
Martijn Otto
4
Für Matthew T. Baker und andere wie mich, die hierher gekommen sind, um zu entscheiden, welche vom Leistungsstandpunkt aus verwendet werden soll, sollten Sie diesen Beitrag lesen, der darauf hinweist, dass Integer in vielen Fällen effizienter als Int16 ist: stackoverflow.com/questions/129023/ net-integer-vs-int16
Tony L.
19
@MartijnOtto Die Frage ist mit C # gekennzeichnet. In C # intist immer Int32 , unabhängig vom System. Vielleicht denken Sie an C ++?
9
@MattBaker: Auf modernen Computern nimmt ein int16 im Allgemeinen so viel Platz ein wie ein int32 (und tatsächlich ein int64), da wir die Daten auffüllen, um Zugriffe an 32- oder 64-Bit-Grenzen auszurichten, damit die meisten Operationen effizient sind (im 32- bzw. 64-Bit-Modus). Dies liegt daran, dass nicht ausgerichtete Zugriffe auf einigen Architekturen lächerlich ineffizient und auf anderen nicht möglich sind.
Joel
118

Der einzige wirkliche Unterschied ist hier die Größe. Alle int-Typen hier sind vorzeichenbehaftete Ganzzahlwerte mit unterschiedlichen Größen

  • Int16: 2 Bytes
  • Int32und int: 4 Bytes
  • Int64 : 8 Bytes

Es gibt einen kleinen Unterschied zwischen Int64und dem Rest. Auf einer 32-Bit-Plattform Int64ist nicht garantiert, dass Zuordnungen zu einem Speicherort atomar sind. Es ist für alle anderen Typen garantiert.

JaredPar
quelle
Wenn ich in benutze, Int64mit 32 bit Windows Operating Systemwelchen Problemen könnte ich dann konfrontiert werden? Gibt es ein Beispiel?
Shaijut
70

int

Es ist ein primitiver Datentyp, der in C # definiert ist.

Es ist Int32 vom Typ FCL zugeordnet.

Es ist ein Werttyp und repräsentiert die System.Int32-Struktur.

Es ist signiert und benötigt 32 Bit.

Es hat einen minimalen Wert von -2147483648 und einen maximalen Wert von +2147483647.

Int16

Es ist ein FCL-Typ.

In C # wird short auf Int16 abgebildet.

Es ist ein Werttyp und repräsentiert die System.Int16-Struktur.

Es ist signiert und benötigt 16 Bit.

Es hat einen minimalen Wert von -32768 und einen maximalen Wert von +32767.

Int32

Es ist ein FCL-Typ.

In C # wird int Int32 zugeordnet.

Es ist ein Werttyp und repräsentiert die System.Int32-Struktur.

Es ist signiert und benötigt 32 Bit.

Es hat einen minimalen Wert von -2147483648 und einen maximalen Wert von +2147483647.

Int64

Es ist ein FCL-Typ.

In C # wird long Int64 zugeordnet.

Es ist ein Werttyp und repräsentiert die System.Int64-Struktur.

Es ist signiert und benötigt 64 Bit.

Es hat einen minimalen Wert von –9.223.372.036.854.775.808 und einen maximalen Wert von 9.223.372.036.854.775.807.

Haris
quelle
Nur um diesen Int64Datentyp hinzuzufügen, kann er mit Loder als lSuffix dargestellt werden, während Int16oder Int32ohne Suffix in C #.
RBT
14

Laut Jeffrey Richter (einer der Mitwirkenden an der Entwicklung von .NET Frameworks) hat das Buch 'CLR via C #':

int ist ein primitiver Typ, der vom C # -Compiler zugelassen wird, während Int32 der Framework Class Library-Typ ist (verfügbar für Sprachen, die CLS einhalten). Tatsächlich wird int während der Kompilierung in Int32 übersetzt.

Ebenfalls,

In C # können lange System.Int64 zugeordnet werden, in einer anderen Programmiersprache jedoch lange Int16 oder Int32. Tatsächlich behandelt C ++ / CLI so lange wie Int32.

Tatsächlich behandeln die meisten (.NET-) Sprachen nicht einmal lange ein Schlüsselwort und kompilieren keinen Code, der es verwendet.

Ich habe diesen Autor und viele Standardliteratur zu .NET gesehen, die FCL-Typen (dh Int32) den sprachspezifischen primitiven Typen (dh int) vorziehen, hauptsächlich zu solchen Interoperabilitätsproblemen.

Praveen
quelle
8

Nichts. Der einzige Unterschied zwischen den Typen besteht in ihrer Größe (und damit im Wertebereich, den sie darstellen können).

Dämmerung -inaktiv-
quelle
8

Ein sehr wichtiger Hinweis zu den Typen 16, 32 und 64:

Wenn Sie diese Abfrage ausführen ... Array.IndexOf (neues Int16 [] {1,2,3}, 1)

Es wird angenommen, dass Sie Null (0) erhalten, weil Sie fragen ... ist 1 innerhalb des Arrays von 1, 2 oder 3. Wenn Sie -1 als Antwort erhalten, bedeutet dies, dass 1 nicht innerhalb des Arrays von 1, 2 oder 3 liegt .

Schauen Sie sich an, was ich gefunden habe: Alle folgenden Punkte sollten 0 und nicht -1 ergeben (ich habe dies in allen Framework-Versionen 2.0, 3.0, 3.5, 4.0 getestet).

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)

Mein Punkt ist also, für Array.IndexOf-Vergleiche nur Int32 zu vertrauen!

tno2007
quelle
7
Um zu verdeutlichen, warum das erste Beispiel so funktioniert: Das erste Literal 1, die 2 und die 3 werden implizit so umgewandelt short, dass sie in das Array passen, während das zweite Literal 1 wie gewohnt belassen wird int. (int)1ist nicht gleich betrachtet (short)1, (short)2, (short)3, so ist das Ergebnis -1.
4
Für die C # -Versionen wäre eine ähnliche Anpassung verfügbar, aber zu Ihrer Information, ein einfacher Typspezifizierer behebt dieses 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)Alle funktionieren wie erwartet.
Mark Hurd
1
Und diejenigen, die nicht funktionieren, haben die Object[],ObjectÜberlastung genutzt. C # erhöht das bei Bedarf implizit intauf a long(und erhöht auch a shortauf ein intoder long), wird jedoch nicht implizit heruntergeworfen, sondern verwendet objectstattdessen die Überladung. With Option Strict Onoder OffVB verwendet die typisierte Überladung nur, wenn die einheitlichen Typen angegeben sind, andernfalls wird die objectÜberladung verwendet.
Mark Hurd
Ihre Antwort ist irreführend. Der Code vergleicht Werte verschiedener Typen. Die Schlussfolgerung for Array.IndexOf comparisons, only trust Int32!ist falsch. Wenn Sie das letzte 1Argument in den entsprechenden Array-Typ umwandeln, funktioniert es wie erwartet.
Don Cheadle
Dies ist ein sehr interessantes und unerwartetes Verhalten (da int zu lang funktioniert, aber kurz zu int nicht), daher die positive Bewertung!
sth_Weird
7

EDIT: Dies gilt nicht ganz für C #, ein Tag, das ich bei der Beantwortung dieser Frage verpasst habe. Wenn es eine spezifischere C # -Antwort gibt, stimmen Sie stattdessen dafür ab!


Sie alle repräsentieren ganzzahlige Zahlen unterschiedlicher Größe.

Es gibt jedoch einen sehr sehr kleinen Unterschied.

int16, int32 und int64 haben alle eine feste Größe.

Die Größe eines Int hängt von der Architektur ab, für die Sie kompilieren. Die C-Spezifikation definiert ein Int nur als größer oder gleich einem Short, obwohl es in der Praxis die Breite des Prozessors ist, auf den Sie abzielen, wahrscheinlich 32 Bit, aber Sie sollten es wissen dass es nicht sein könnte.

DeanWombourne
quelle
1
Dies sollte die akzeptierte Antwort sein, da dies die einzige ist, die tatsächlich richtig ist
mjs
2
Nein, das gilt nicht für C #. AC # int ist immer 32 Bit groß. Ja, für C mussten Sie sich mit dieser Komplikation befassen, und im C-Code werden häufig Makros angezeigt, um mit variablen int-Größen umzugehen. Siehe ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf Seite 18.
Ananke
@ Ananke Ahh, habe das C # -Tag verpasst. Ich wünschte, ich könnte einige Stimmen auf die Antworten
zurücksetzen
6
  1. intund int32sind ein und dasselbe (32-Bit-Ganzzahl)
  2. int16 ist kurz int (2 Bytes oder 16 Bit)
  3. int64 ist der lange Datentyp (8 Byte oder 64 Bit)
Sunil Kumar BM
quelle
2
Es wird nicht garantiert, dass int 32 Bit beträgt.
mjs
8
@mjs, das ist einfach nicht wahr. In C # intist ein Alias ​​für Int32und somit immer 32 Bit garantiert.
David Arno
Tatsächlich ist das, was mjs sagt, richtig. INT bedeutet eine Ganzzahl, die auf dem System x86 oder x64 basiert. Wenn Ihr System also x64 ist, ist int Int64, daher wird nicht garantiert, dass es 32 ist. Wenn Sie int32 in ein x64 einfügen, ist int64 immer int32 .
Yogurtu
5
Nein, was David Arno sagt, ist richtig. Die C # -Sprache definiert 'int' speziell als 32-Bit-Ganzzahl (Int32). Andere Sprachen (C / C ++ usw.) geben dies möglicherweise nicht an, aber diese Frage ist mit "C #" gekennzeichnet.
Theo Brinkman
@TheoBrinkman Richtig, hier ist die Microsoft-Seite zu den integralen numerischen Typen von C #: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Max Barraclough,
5

Sie sind beide in der Tat synonym, jedoch fand ich den kleinen Unterschied zwischen ihnen,

1) Sie können nicht Int32beim Erstellen verwendenenum

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

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

2) Int32fällt unter die Systemdeklaration. Wenn Sie entfernen, erhalten using.SystemSie einen Kompilierungsfehler, aber nicht für den Fallint

this.girish
quelle
-8

Int = Int32 -> Ursprünglicher langer Typ

Int16 -> Original int

Int64 -> Neuer Datentyp wird nach 64-Bit-Systemen verfügbar

"int" ist nur aus Gründen der Abwärtskompatibilität verfügbar. Wir sollten wirklich neue int-Typen verwenden, um unsere Programme präziser zu machen.

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

Eine weitere Sache, die mir auf dem Weg aufgefallen ist, ist, dass es keine Klasse gibt Int, die Int16, Int32 und Int64 ähnelt. Alle hilfreichen Funktionen wie TryParsefür Integer stammen von Int32.TryParse.

Mahesh
quelle