Frage

In meinem C# - Quellcode kann ich haben erklärt, Integer-zahlen, wie:

int i = 5;

oder

Int32 i = 5;

In der zurzeit vorherrschenden 32-bit-Welt sind Sie gleichwertig.Doch wie bewegen wir uns in eine 64-bit-Welt, bin ich richtig zu sagen, dass im folgenden werden das gleiche?

int i = 5;
Int64 i = 5;
War es hilfreich?

Lösung

Nein.Die C# - Spezifikation starr definiert, dass int ist ein alias für System.Int32 mit genau 32 bits.Ändern, dies wäre ein major breaking ändern.

Andere Tipps

Die int Schlüsselwort in C# definiert wird, als alias für den System.Int32 geben und das ist (gemessen an der name) soll eine 32-bit-Ganzzahl.Die Spezifikation:

CLI-Spezifikation Abschnitt 8.2.2 (Gebaut-in Wert-und Referenztypen) hat eine Tabelle mit den folgenden:

  • System.Int32 - Signed 32-bit integer

C# - Spezifikation Abschnitt 8.2.1 (Vordefinierte Typen) hat eine ähnliche Tabelle:

  • int - 32-bit signed integral type

Dies garantiert, dass sowohl System.Int32 in der CLR und int in C# wird immer die 32-bit.

  

Wird sizeof (testInt) je 8 sein?

Nein, sizeof (testInt) ist ein Fehler aufgetreten. testInt ist eine lokale Variable. Der Operator sizeof erfordert einen Typ als Argument. Das wird nie 8, weil es immer ein Fehler sein.

  

VS2010 kompiliert ein C # Ganzzahl als 4 Bytes verwaltet, auch auf einer 64-Bit-Maschine.

Richtig. Ich stelle fest, dass Abschnitt 18.5.8 der C # Spezifikation sizeof(int) als die Kompilierung-Konstante 4. Das definiert ist, wenn Sie den Compiler sizeof(int) sagen einfach ersetzt, dass mit 4; es ist, als ob Sie gesagt hat „4“ in dem Quellcode.

  

Wer weiß, ob / wann wird die Zeit kommen, dass ein Standard "int" in C # 64 Bits sein?

Nie. Abschnitt 4.1.4 der C # Spezifikation besagt, dass „int“ ist ein Synonym für „System.Int32“.

Wenn, was Sie wollen, ist ein „Zeiger-Größe integer“ dann IntPtr verwenden. Ein IntPtr ändert seine Größe auf unterschiedlichen Architekturen.

int ist immer gleichbedeutend mit Int32 auf allen Plattformen.

Es ist sehr unwahrscheinlich, dass Microsoft, dass sich in Zukunft ändern wird, da es eine Menge vorhandenen Code brechen würde, die int annimmt, ist 32-Bit.

Ich denke, was Sie vielleicht verwirrt, ist, dass int ist ein alias für Int32 also es werden immer 4 bytes, aber IntPtr wird angenommen, entsprechend der Wortbreite der CPU-Architektur so wird es 4 bytes auf einem 32-bit-system und 8 Byte auf einem 64-bit-system.

Nach der C # Spezifikation ECMA-334 , Abschnitt "11.1.4 Einfache Typen", wird das reservierte Wort int System.Int32 aliased werden. Da dies in der Spezifikation ist es sehr unwahrscheinlich ist, zu ändern.

Egal, ob Sie die 32-Bit-Version oder eine 64-Bit-Version des CLR verwenden, eine int in C # bedeutet immer System.Int32 und long immer System.Int64 bedeuten.

Im Folgenden wird immer wahr in C # sein:

sbyte unterzeichnet 8 Bit, 1 Byte

Byte unsigned 8 Bit, Byte 1

kurz unterzeichnet 16 Bit, 2 Bytes

ushort unsigned 16 Bits, 2 Bytes

int signierter 32-Bit, 4 Bytes

uint unsigned 32 Bits, 4 Bytes

lang unterzeichnet 64 Bits, 8 Byte

ULONG unsigned 64 Bits, 8 Byte

Eine ganze Zahl wörtliche ist nur eine Folge von Ziffern (zB 314159) ohne jeder dieser expliziten Typen. C # weist es den ersten Typ in der Folge ( int , uint , lange , ULONG ), in dem es passt . Dies scheint darauf hinzu wurde oben in mindestens eine der Antworten etwas verworren.

Weirdly die einstellige minus Operator (Minuszeichen), bevor eine Folge von Ziffern zeigt sich nicht nicht reduzieren die Wahl ( int , lang ) . Die wörtliche ist immer positiv; das Minuszeichen ist wirklich ein Operator. So vermutlich -314159 ist genau das Gleiche wie -((int)314159). Mit Ausnahme offenbar einen Sonderfall gibt es -2147483648 direkt in ein int zu erhalten; sonst würde es -((uint)2147483648) werden. Welche nehme ich an etwas tut, unangenehm.

Irgendwie scheint es sicher, dass C # (und Freunde) vorherzusagen, wird nie mit „matschig Namen“ Typen für> = 128 Bit-Integer stören. Wir werden für nette Unterstützung bekommen beliebig große ganze Zahlen und super-präzise Unterstützung für UInt128, UInt256 etc. sobald Prozessoren Mathematik unterstützen zu tun, die weit und so gut wie nie irgendetwas davon verwenden. 64-Bit-Adressräume sind wirklich groß. Wenn sie jemals zu klein sind wird es für einigen esoterischen Grund wie ASLR oder eine effizientere MapReduce oder etwas sein.

Ja, wie Jon gesagt, und im Gegensatz zu der "C / C ++ Welt, Java und C # ist nicht abhängig von dem System, das sie auf ausführen. Sie haben genau definierte Längen für Byte / short / int / long und single / double precision Schwimmer, gleich auf jedem System.

int ohne Suffix entweder 32bit oder 64bit sein kann, es hängt von dem Wert es darstellt.

wie definiert in MSDN:

  

Wenn ein Ganzzahlliteral kein Suffix aufweist, ist seine Art die erste dieser Typen, in denen ihr Wert dargestellt werden kann. Int, uint, long, ULONG

Hier ist die Adresse: https://msdn.microsoft.com/en-us/library/5kzh1b5w.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top