2009-03-16 12 views
40

Wenn ich in meinem C# .NET Projekt sizeof(int) mache, bekomme ich einen Rückgabewert von 4. Ich setze den Projekttyp auf x64, also warum sagt es 4 statt 8? Liegt das daran, dass ich verwalteten Code ausführe?sizeof (int) auf x64?

+3

Nicht verwalteter Code trifft die gleiche Entscheidung wie .NET. In normalem C++ ist sizeof (int) ebenfalls 4. Stellen Sie sich x64 als Erweiterung einer 32-Bit-Architektur vor. Der Standardwert ist 32, Sie können jetzt auch 64-Bit-Daten verarbeiten *. – jalf

+1

@jalf, um genau zu sein, hatten wir bereits die Möglichkeit, 64-Bit-Daten zu verarbeiten, aber die x64-CPUs machen es aufgrund der nativen Unterstützung schneller. –

+2

Warum ist das geschlossen? Obwohl die Frage technisch identisch ist, geht es um Java, hier geht es um .NET/C#. –

Antwort

36

Es gibt various 64-bit data models; Microsoft verwendet LP64 für .NET: Sowohl als auch s und Zeiger sind 64-Bit (obwohl traditionelle C-style Zeiger nicht existieren. NET). Vergleichen Sie dies mit ILP64, wobei int s auch 64-Bit sind.

Somit ist auf allen Plattformen int 32-Bit und long ist 64-Bit; Sie können dies in den Namen der zugrunde liegenden Typen System.Int32 und System.Int64 sehen.

+7

Sie sollten Ihre Antwort so bearbeiten, wie sie akzeptiert wird, um sie vollständig zu korrigieren. Entfernen Sie, wo Sie sagen, "obwohl traditionelle C-Style-Zeiger nicht existieren." Und Detail System.IntPtr hängt von der Architektur ab. –

+1

Sie können "C-style" -Zeiger in C# verwenden, sie müssen nur im unsicheren Kontext ausgeführt werden.Wie "fnieto" sagte, müssen Sie beachten, dass IntPtr hängt von der Plattform ab, wo "sizeof (IntPtr) == 4" in x86 & "sizeof (IntPtr) == 8" in x64. – zezba9000

45

Das Schlüsselwort int Aliase System.Int32, die immer noch 4 Bytes benötigt, sogar auf einer 64-Bit-Maschine.

24

int bedeutet Int32 in .NET-Sprachen. Dies wurde für die Kompatibilität zwischen 32- und 64-Bit-Architekturen getan.

Hier ist die table of all the types in C# und was sie .NET-weise zuordnen.

4

Denken Sie daran, int ist nur ein Compiler-Alias ​​für den Basistyp Int32. Angesichts der Tatsache, dass es offensichtlich sein sollte, warum int nur 32 Bits auf einer 64-Bit-Plattform ist.

12

Vielleicht denken Sie an einen Zeiger int oder System.IntPtr. Das wären 8 Bytes auf einem x64 und 4 Bytes auf einem x86. Die Größe eines Zeigers zeigt, dass Sie 64-Bit-Adressen für Ihren Speicher haben. (System.IntPtr.Size == 8 auf x64)

Die Bedeutung von int ist immer noch 4 Bytes, ob Sie auf einem x86 oder einem x64 sind. Das heißt, ein int entspricht immer System.Int32.

14

Ein Int32 ist 4 Bytes auf x86 und x64. Ein Int64 ist 8 Bytes in beiden Fällen. Der C# int Typ ist nur ein Alias ​​für System.Int32. Dasselbe gilt für beide Laufzeitumgebungen. Die einzige Art, die auf der Laufzeitumgebung abhängig ändert ein IntPtr:

unsafe 
    { 
     var size = sizeof(IntPtr); // 4 on x86 bit machines. 8 on x64 
    } 
+4

Oder Sie können nur IntPtr.Size überprüfen, die keinen unsicheren Code erfordert. –

+0

... und UIntPtr, natürlich. ... und unsichere Zeigertypen. –

+0

Gut zu beachten: UIntPtr ist nicht CLS-konform. –

2
int i; 
int size = BitConverter.GetBytes(i).Lenght; 
+3

Diese Frage wurde vor 3 Jahren gestellt und hat bereits eine akzeptierte Antwort. Sehen Sie, ob Sie Antworten auf aktuelle Fragen geben können, die noch keine akzeptierte Antwort haben. – mcknz

+1

Ich denke, es ist offensichtlich, weil "Lenght" – Laie