¿Cuál es la diferencia entre int, Int16, Int32 e Int64?

229

¿Cuál es la diferencia entre int, System.Int16, System.Int32y System.Int64aparte de sus tamaños?

Joby Kurian
fuente

Respuestas:

348

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 de Int32hecho 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 las Int32variables de la misma manera .

El código resultante será idéntico: la diferencia es puramente legible o la apariencia del código.

Comunidad
fuente
1
Si sabe que el valor no será superior a 65.535 (con signo) o de −32.768 a 32.767 (sin signo), ¿no sería mejor definir el número entero int16para ahorrar recursos de memoria, en lugar de simplemente usarlo int?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
8
int e int32 pueden ser sinónimos, pero no necesariamente. Hoy en día, la mayoría de los sistemas vendidos son de 64 bits, en cuyo caso un int será de 64 bits.
Martijn Otto
44
Para Matthew T. Baker y cualquier otro como yo que vino aquí tratando de decidir cuál usar desde el punto de vista del rendimiento, debe consultar esta publicación que sugiere que Integer es más eficiente que Int16 en muchos casos: stackoverflow.com/questions/129023/ net-integer-vs-int16
Tony L.
19
@MartijnOtto La pregunta está etiquetada C #. En C #, siempreint es , independientemente del sistema. ¿Quizás estás pensando en C ++? Int32
99
@MattBaker: en general, en las computadoras modernas, un int16 ocupa tanto espacio como un int32 (y en realidad un int64) porque para que la mayoría de las operaciones sean eficientes, rellenamos los datos para hacer que los accesos estén alineados a los límites de 32 o 64 bits (en modos de 32 o 64 bits, respectivamente). Esto se debe a que los accesos no alineados son ridículamente ineficientes en algunas arquitecturas, y no son posibles en otras.
Joel
118

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 bytes
  • Int32y int: 4 bytes
  • Int64 : 8 bytes

Hay 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.

JaredPar
fuente
Si uso Int64en 32 bit Windows Operating Systementonces ¿cuáles son los problemas que podría enfrentar? ¿Hay algún ejemplo?
shaijut
70

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.

Haris
fuente
Solo para agregar que Int64el tipo de datos se puede representar usando Lo lsufijo mientras Int16o Int32no tiene sufijo en C #.
RBT
14

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.

Praveen
fuente
8

Nada. La única diferencia entre los tipos es su tamaño (y, por lo tanto, el rango de valores que pueden representar).

duskwuff -inactive-
fuente
8

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!

tno2007
fuente
77
Para aclarar por qué el primer ejemplo funciona de esa manera: el primer literal 1, el 2 y el 3 se convierten implícitamente 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.
44
Habría un ajuste similar disponible para las versiones de C #, pero para su información, un simple especificador de tipo soluciona este problema: 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.
Mark Hurd
1
Y los que no funcionan han usado la 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.
Mark Hurd
Tu respuesta es engañosa. El código está comparando valores de diferentes tipos. La conclusión for Array.IndexOf comparisons, only trust Int32!está mal. Si lanza el 1argumento final al tipo de matriz correspondiente, funciona como se esperaba.
Don Cheadle
Este es un comportamiento muy interesante e inesperado (desde int a long works pero short a int no lo hace), de ahí el voto positivo.
sth_Weird
7

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í

DeanWombourne
fuente
1
Esta debería ser la respuesta aceptada, ya que esta es la única que es correcta
mjs
2
No, esto no es cierto para C #. AC # int siempre tiene un tamaño de 32 bits. Para C, sí, tenía que lidiar con esta complicación y, a menudo, ve macros en el código C para lidiar con tamaños int variables. Ver ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf página 18.
Ananke
@Ananke Ahh, perdí la etiqueta C #. Ojalá pudiera revertir algunos votos sobre las respuestas .....
mjs
6
  1. inty int32son uno y el mismo (entero de 32 bits)
  2. int16 es corto int (2 bytes o 16 bits)
  3. int64 es el tipo de datos largo (8 bytes o 64 bits)
Sunil Kumar BM
fuente
2
int no tiene garantía de 32 bits.
mjs
8
@mjs, esto simplemente no es cierto. En C #, intes un alias para Int32y, por lo tanto, siempre se garantiza que sea de 32 bits.
David Arno
En realidad, lo que dice mjs es correcto, INT significa entero basado en el sistema x86 o x64, por lo que si su sistema es x64, int será Int64, por lo tanto, no se garantiza que sea 32 .. Si coloca int32 en un x64 siempre será int32 .
Yogurtu
55
No, lo que dice David Arno es correcto. El lenguaje C # define específicamente 'int' para significar un entero de 32 bits (Int32). Otros lenguajes (C / C ++, etc.) pueden no especificar eso, pero esta pregunta está etiquetada como 'C #'.
Theo Brinkman
@TheoBrinkman Correcto, aquí está la página de Microsoft sobre los tipos numéricos integrales de C # s: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Max Barraclough
5

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

this.girish
fuente
-8

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.

Mahesh
fuente