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?
Respuesta
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.
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. –
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
La palabra clave int
aliases System.Int32
que aún requiere 4 bytes, incluso en una máquina de 64 bits.
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.
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.
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
.
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
}
O simplemente puede marcar IntPtr.Size, que no requiere código inseguro. –
... y UIntPtr, por supuesto. ... y tipos de punteros inseguros. –
Es bueno tener en cuenta: UIntPtr no cumple con CLS. –
- 1. sizeof (int) == sizeof (void *)?
- 2. ¿Por qué sizeof (int) es diferente de sizeof (int *)?
- 3. C - int sizeof gama siempre devuelve 4
- 4. ¿Por qué es -1> sizeof (int)?
- 5. sizeof (struct) devuelve valor inesperado
- 6. ¿Cuándo sizeof (myPOD) es demasiado grande para pasar por valor en x64?
- 7. sizeof plantilla variadic (suma de sizeof de todos los elementos)
- 8. uso de operador sizeof
- 9. C++ sizeof con bool
- 10. sizeof array clarification
- 11. ¿Qué hace sizeof?
- 12. operador sizeof() en C
- 13. sizeof() std :: vector (C++)
- 14. sizeof java object
- 15. C2070 - operando sizeof ilegal
- 16. C char * sizeof gama
- 17. Sizeof Puntero al array
- 18. implementar su propio sizeof
- 19. cadena literal Sizeof
- 20. En C, ¿por qué sizeof (char) 1, cuando 'a' es un int?
- 21. Comportamiento del operador sizeof en C
- 22. Obtener sizeof (tipo) en Windbg
- 23. sizeof() en la memoria malloc'd
- 24. ¿Puedo instalar Windbg x86/x64 en mi x64 WIN7?
- 25. C sizeof una matriz pasada
- 26. ¿Cuál es el tamaño de (main), sizeof (printf), sizeof (scanf)?
- 27. sizeof() estructuras desconocidas. ¿Por qué?
- 28. sizeof (long) en 64 bits C++
- 29. C# sizeof decimal?
- 30. sizeof a struct member
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
@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. –
¿Por qué está cerrado? Aunque técnicamente idéntica, la otra pregunta es sobre Java, se trata de .NET/C#. –