Was ist der Unterschied zwischen int
, System.Int16
, System.Int32
und System.Int64
anders als ihre Größen?
229
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 :
int
undInt32
sind in der Tat auch;int
wird ein wenig vertrauter aussehen,Int32
macht die 32-Bit für diejenigen, die Ihren Code lesen, expliziter. Ich würde gerne int verwenden, wenn ich nur 'eine Ganzzahl' benötige,Int32
wo die Größe wichtig ist (kryptografischer Code, Strukturen), damit zukünftige Betreuer wissen, dass es sicher ist, eineint
gegebenenfalls zu vergrößern , aber darauf achten sollten,Int32
Variablen auf die gleiche Weise zu ändern .Der resultierende Code ist identisch: Der Unterschied besteht lediglich in der Lesbarkeit oder dem Erscheinungsbild des Codes.
int16
, um Speicherressourcen zu sparen, anstatt sie einfach zu verwendenint
?int
ist immerInt32
, unabhängig vom System. Vielleicht denken Sie an C ++?Der einzige wirkliche Unterschied ist hier die Größe. Alle int-Typen hier sind vorzeichenbehaftete Ganzzahlwerte mit unterschiedlichen Größen
Int16
: 2 BytesInt32
undint
: 4 BytesInt64
: 8 BytesEs gibt einen kleinen Unterschied zwischen
Int64
und dem Rest. Auf einer 32-Bit-PlattformInt64
ist nicht garantiert, dass Zuordnungen zu einem Speicherort atomar sind. Es ist für alle anderen Typen garantiert.quelle
Int64
mit32 bit Windows Operating System
welchen Problemen könnte ich dann konfrontiert werden? Gibt es ein Beispiel?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.
quelle
Int64
Datentyp hinzuzufügen, kann er mitL
oder alsl
Suffix dargestellt werden, währendInt16
oderInt32
ohne Suffix in C #.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,
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.
quelle
Nichts. Der einzige Unterschied zwischen den Typen besteht in ihrer Größe (und damit im Wertebereich, den sie darstellen können).
quelle
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 #:
VB.NET:
Mein Punkt ist also, für Array.IndexOf-Vergleiche nur Int32 zu vertrauen!
quelle
short
, dass sie in das Array passen, während das zweite Literal 1 wie gewohnt belassen wirdint
.(int)1
ist nicht gleich betrachtet(short)1
,(short)2
,(short)3
, so ist das Ergebnis -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)
Alle funktionieren wie erwartet.Object[],Object
Überlastung genutzt. C # erhöht das bei Bedarf implizitint
auf along
(und erhöht auch ashort
auf einint
oderlong
), wird jedoch nicht implizit heruntergeworfen, sondern verwendetobject
stattdessen die Überladung. WithOption Strict On
oderOff
VB verwendet die typisierte Überladung nur, wenn die einheitlichen Typen angegeben sind, andernfalls wird dieobject
Überladung verwendet.for Array.IndexOf comparisons, only trust Int32!
ist falsch. Wenn Sie das letzte1
Argument in den entsprechenden Array-Typ umwandeln, funktioniert es wie erwartet.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.
quelle
int
undint32
sind ein und dasselbe (32-Bit-Ganzzahl)int16
ist kurz int (2 Bytes oder 16 Bit)int64
ist der lange Datentyp (8 Byte oder 64 Bit)quelle
int
ist ein Alias fürInt32
und somit immer 32 Bit garantiert.Sie sind beide in der Tat synonym, jedoch fand ich den kleinen Unterschied zwischen ihnen,
1) Sie können nicht
Int32
beim Erstellen verwendenenum
2)
Int32
fällt unter die Systemdeklaration. Wenn Sie entfernen, erhaltenusing.System
Sie einen Kompilierungsfehler, aber nicht für den Fallint
quelle
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 wieTryParse
für Integer stammen vonInt32.TryParse
.quelle