¿Cuál es la diferencia entre int, System.Int16, System.Int32y System.Int64aparte de sus tamaños?
¿Cuál es la diferencia entre int, System.Int16, System.Int32y System.Int64aparte de sus tamaños?
Respuestas:
Cada tipo de entero tiene un rango diferente de capacidad de almacenamiento
Type Capacity
Int16 -- (-32,768 to +32,767)
Int32 -- (-2,147,483,648 to +2,147,483,647)
Int64 -- (-9,223,372,036,854,775,808 to +9,223,372,036,854,775,807)
Como dijo James Sutherland en su respuesta :
inty deInt32hecho son sinónimos;intserá un poco más familiar,Int32hace que la 32 bits sea más explícita para aquellos que leen su código. Me inclinaría a usar int donde solo necesito 'un número entero',Int32donde el tamaño es importante (código criptográfico, estructuras) para que los futuros mantenedores sepan que es seguro ampliar y,intsi corresponde, pero que deberían cambiar lasInt32variables de la misma manera .El código resultante será idéntico: la diferencia es puramente legible o la apariencia del código.
int es , independientemente del sistema. ¿Quizás estás pensando en C ++? Int32
La única diferencia real aquí es el tamaño. Todos los tipos int aquí son valores enteros con signo que tienen tamaños variables
Int16: 2 bytesInt32y int: 4 bytesInt64 : 8 bytesHay una pequeña diferencia entre Int64y el resto. En una plataforma de 32 bits, Int64no se garantiza que las asignaciones a una ubicación de almacenamiento sean atómicas. Está garantizado para todos los otros tipos.
Int64en 32 bit Windows Operating Systementonces ¿cuáles son los problemas que podría enfrentar? ¿Hay algún ejemplo?
En t
Es un tipo de datos primitivo definido en C #.
Se asigna a Int32 de tipo FCL.
Es un tipo de valor y representa la estructura System.Int32.
Está firmado y toma 32 bits.
Tiene un mínimo de -2147483648 y un máximo de +2147483647.
Int16
Es un tipo de FCL.
En C #, corto se asigna a Int16.
Es un tipo de valor y representa System.Int16 struct.
Está firmado y toma 16 bits.
Tiene un mínimo de -32768 y un valor máximo de +32767.
Int32
Es un tipo de FCL.
En C #, int se asigna a Int32.
Es un tipo de valor y representa la estructura System.Int32.
Está firmado y toma 32 bits.
Tiene un mínimo de -2147483648 y un máximo de +2147483647.
Int64
Es un tipo de FCL.
En C #, long se asigna a Int64.
Es un tipo de valor y representa la estructura System.Int64.
Está firmado y toma 64 bits.
Tiene un valor mínimo de –9,223,372,036,854,775,808 y un valor máximo de 9,223,372,036,854,775,807.
Int64el tipo de datos se puede representar usando Lo lsufijo mientras Int16o Int32no tiene sufijo en C #.
De acuerdo con Jeffrey Richter (uno de los contribuyentes del desarrollo del framework .NET) 'CLR via C #':
int es un tipo primitivo permitido por el compilador de C #, mientras que Int32 es el tipo Framework Class Library (disponible en todos los lenguajes que cumplen con CLS). De hecho, int se traduce en Int32 durante la compilación.
También,
En C #, long se asigna a System.Int64, pero en un lenguaje de programación diferente, long podría asignarse a Int16 o Int32. De hecho, C ++ / CLI trata siempre que Int32.
De hecho, la mayoría de los lenguajes (.NET) ni siquiera se tratarán como una palabra clave y no compilarán el código que la usa.
He visto a este autor, y mucha literatura estándar sobre .NET que prefiere los tipos FCL (es decir, Int32) a los tipos primitivos específicos del lenguaje (es decir, int), principalmente en cuestiones de interoperabilidad.
Nada. La única diferencia entre los tipos es su tamaño (y, por lo tanto, el rango de valores que pueden representar).
Una nota muy importante sobre los tipos 16, 32 y 64:
si ejecuta esta consulta ... Array.IndexOf (nuevo Int16 [] {1,2,3}, 1)
se supone que debe obtener cero (0) porque está preguntando ... es 1 dentro del conjunto de 1, 2 o 3. si obtiene -1 como respuesta, significa que 1 no está dentro del conjunto de 1, 2 o 3 .
Mira lo que encontré: todo lo siguiente debería darte 0 y no -1 (lo he probado en todas las versiones 2.0, 3.0, 3.5, 4.0)
C#:
Array.IndexOf(new Int16[]{1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32[]{1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64[]{1,2,3}, 1) = 0 (correct)
VB.NET:
Array.IndexOf(new Int16(){1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32(){1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64(){1,2,3}, 1) = -1 (not correct)
Entonces, mi punto es, para las comparaciones Array.IndexOf, ¡solo confíe en Int32!
shorten ellos para que quepan en la matriz, mientras que el segundo literal 1 se deja como ordinario int. (int)1no se considera igual a (short)1, (short)2, (short)3, por lo tanto el resultado es -1.
Array.IndexOf(new Int16(){1,2,3}, 1S) Array.IndexOf(new Int32(){1,2,3}, 1I) Array.IndexOf(new Int64(){1,2,3}, 1L)todo funciona como se esperaba.
Object[],Objectsobrecarga. C # está elevando implícitamente inta a longcuando sea necesario (y también eleva a shorta an into long), pero no se rechazará implícitamente, utilizando la objectsobrecarga. Con Option Strict Ono OffVB solo usará la sobrecarga escrita cuando se proporcionen los tipos uniformes; de lo contrario, usará la objectsobrecarga.
for Array.IndexOf comparisons, only trust Int32!está mal. Si lanza el 1argumento final al tipo de matriz correspondiente, funciona como se esperaba.
EDITAR: Esto no es del todo cierto para C #, una etiqueta que me perdí cuando respondí esta pregunta; si hay una respuesta más específica de C #, ¡vote por eso!
Todos representan números enteros de diferentes tamaños.
Sin embargo, hay una muy, muy pequeña diferencia.
int16, int32 e int64 tienen un tamaño fijo .
El tamaño de un int depende de la arquitectura para la que está compilando: la especificación de C solo define un int como más grande o igual a un corto, aunque en la práctica es el ancho del procesador al que se dirige, que es probablemente sea de 32 bits, pero debe saber que tal vez no sea así
inty int32son uno y el mismo (entero de 32 bits)int16 es corto int (2 bytes o 16 bits)int64 es el tipo de datos largo (8 bytes o 64 bits)intes un alias para Int32y, por lo tanto, siempre se garantiza que sea de 32 bits.
Ambos son sinónimos, sin embargo, encontré la pequeña diferencia entre ellos,
1) No puedes usar Int32mientras creasenum
enum Test : Int32
{ XXX = 1 // gives you compilation error
}
enum Test : int
{ XXX = 1 // Works fine
}
2) Int32viene bajo declaración del sistema. si elimina using.Systemobtendrá un error de compilación pero no en caso deint
Int = Int32 -> Tipo largo original
Int16 -> Int original
Int64 -> Nuevo tipo de datos disponible después de los sistemas de 64 bits
"int" solo está disponible para compatibilidad con versiones anteriores. Realmente deberíamos estar usando nuevos tipos int para hacer que nuestros programas sean más precisos.
---------------
Una cosa más que noté en el camino es que no hay una clase llamada Intsimilar a Int16, Int32 e Int64. Todas las funciones útiles como TryParsefor integer provienen de Int32.TryParse.
int16para ahorrar recursos de memoria, en lugar de simplemente usarloint?