¿Cuál es la diferencia entre int
, System.Int16
, System.Int32
y System.Int64
aparte de sus tamaños?
Respuestas
¿Demasiados anuncios?Cada tipo de entero tiene un rango diferente de capacidad de almacenamiento
Tipo Capacidad
Int16 -- (-32,768 a +32,767)
Int32 -- (-2,147,483,648 a +2,147,483,647)
Int64 -- (-9,223,372,036,854,775,808 a +9,223,372,036,854,775,807)
Como afirmó James Sutherland en su respuesta:
int
eInt32
son de hecho sinónimos;int
será un poco más familiar,Int32
hace que los 32 bits sean más explícitos para aquellos que leen tu código. Me inclinaría a usar int cuando solo necesito 'un entero',Int32
donde el tamaño es importante (código criptográfico, estructuras) para que los futuros mantenedores sepan que es seguro aumentar unint
si es necesario, pero deben tener cuidado al cambiar variablesInt32
de la misma manera.El código resultante será idéntico: la diferencia es puramente en cuanto a legibilidad o apariencia del código.
La única diferencia real aquí es el tamaño. Todos los tipos de enteros aquí son valores enteros con signo que tienen tamaños variables
Int16
: 2 bytesInt32
yint
: 4 bytesInt64
: 8 bytes
Hay una pequeña diferencia entre Int64
y el resto. En una plataforma de 32 bits, no se garantiza que las asignaciones a una ubicación de almacenamiento Int64
sean atómicas. Se garantiza para todos los otros tipos.
Según Jeffrey Richter (uno de los contribuyentes del desarrollo del framework .NET) en su libro 'CLR via C#':
int es un tipo primitivo permitido por el compilador de C#, mientras que Int32 es el tipo de la Biblioteca de Clases del Framework (disponible en varios lenguajes que siguen el CLS). De hecho, int se traduce a Int32 durante la compilación.
También,
En C#, long se mapea a System.Int64, pero en un lenguaje de programación diferente, long podría mapear a Int16 o Int32. De hecho, C++/CLI trata long como Int32.
De hecho, la mayoría de los lenguajes (.NET) ni siquiera tratarán long como una palabra clave y no compilarán código que lo utilice.
He visto a este autor y a mucha literatura estándar de .NET prefiriendo los tipos de la FCL (es decir, Int32) a los tipos primitivos específicos del lenguaje (es decir, int), principalmente por preocupaciones de interoperabilidad.