c# 64bit clr sizeof

c# - ¿sizeof(int) en x64?



64bit clr (7)

Hay varios modelos de datos de 64 bits ; Microsoft usa LP64 para .NET: tanto los puntos largos como los punteros son de 64 bits (aunque los punteros de estilo C tradicionales no existen .NET). Contraste esto con ILP64 donde los int s son también 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 .

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


La palabra clave int alias System.Int32 que todavía requiere 4 bytes, incluso en una máquina de 64 bits.


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 en un x64. Es decir que un int siempre corresponderá a System.Int32 .


Recordar int es solo un alias de 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.


Un Int32 es de 4 bytes en x86 y x64. Un Int64 es de 8 bytes en cualquier caso. El tipo int C # es solo un alias para System.Int32 . Lo mismo en ambos entornos de ejecución. El único tipo que cambia según el entorno de ejecución es un IntPtr :

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


int significa Int32 en lenguajes .NET. Esto se hizo por compatibilidad entre arquitecturas de 32 y 64 bits.

Aquí está la tabla de todos los tipos en C # y lo que se asignan a .NET.