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.
int i;
int size = BitConverter.GetBytes(i).GetLength(0);