2009-03-16 21 views
40

Cuando hago sizeof(int) en mi proyecto C# .NET, obtengo un valor de retorno de 4. Establezco el tipo de proyecto en x64, entonces, ¿por qué dice 4 en lugar de 8? ¿Esto es porque estoy ejecutando código administrado?sizeof (int) en x64?

+3

El código no administrado toma la misma decisión que .NET. En C++ simple, sizeof (int) es 4 también. Piense en x64 como extensiones de una arquitectura de 32 bits. El valor predeterminado sigue siendo 32, solo tiene la capacidad de procesar datos de 64 bits * también *. – jalf

+1

@jalf para ser más precisos, ya teníamos la capacidad de procesar datos de 64 bits, sin embargo, las CPU x64 lo hacen más rápido gracias al soporte nativo. –

+2

¿Por qué está cerrado? Aunque técnicamente idéntica, la otra pregunta es sobre Java, se trata de .NET/C#. –

Respuesta

36

Hay various 64-bit data models; Microsoft usa LP64 para .NET: ambos long sy punteros son de 64 bits (aunque los punteros de estilo C tradicionales no existen .NET). Contraste esto con ILP64 donde int s también son de 64 bits.

Por lo tanto, en todas las plataformas, int es de 32 bits y long es de 64 bits; Puede ver esto en los nombres de los tipos subyacentes System.Int32 y System.Int64.

+7

Debe editar su respuesta, ya que es la aceptada para que sea completamente correcta. Elimine donde dice "aunque los punteros estilo C tradicionales no existen .NET" y el detalle System.IntPtr depende de la arquitectura. –

+1

Puede usar punteros "C-style" en C#, solo tienen que hacerse en un contexto inseguro.Como dijo "fnieto", debe tener en cuenta que IntPtr depende de la plataforma, donde "sizeof (IntPtr) == 4" en x86 y "sizeof (IntPtr) == 8" en x64. – zezba9000

45

La palabra clave int aliases System.Int32 que aún requiere 4 bytes, incluso en una máquina de 64 bits.

24

int significa Int32 en .NET languages. Esto se hizo para la compatibilidad entre las arquitecturas de 32 y 64 bits.

Aquí está el table of all the types en C# y lo que asignan a .NET sabio.

4

Recuerde int es solo un alias del compilador para el tipo básico Int32. Dado que debería ser obvio, por qué int es solo de 32 bits en una plataforma de 64 bits.

12

Puede estar pensando en un puntero int o System.IntPtr. Esto sería 8 bytes en un x64 y 4 bytes en un x86. El tamaño de un puntero muestra que tiene direcciones de 64 bits para su memoria. (System.IntPtr.Size == 8 en x64)

El significado de int sigue siendo de 4 bytes, ya sea que esté en un x86 o un x64. Es decir que un int siempre corresponderá a System.Int32.

14

Un Int32 tiene 4 bytes en x86 y x64. Un Int64 tiene 8 bytes en cualquiera de los casos. El tipo C# int es solo un alias para System.Int32. Lo mismo en ambos entornos de tiempo de ejecución. El único tipo que hace cambiar en función del entorno de ejecución es un IntPtr:

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

O simplemente puede marcar IntPtr.Size, que no requiere código inseguro. –

+0

... y UIntPtr, por supuesto. ... y tipos de punteros inseguros. –

+0

Es bueno tener en cuenta: UIntPtr no cumple con CLS. –

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

Esta pregunta fue hecha hace 3 años y ya tiene una respuesta aceptada. Vea si puede proporcionar respuestas a preguntas recientes que todavía no tienen una respuesta aceptada. – mcknz

+1

Supongo que se dedica porque "Lenght", obviamente – Laie