Qual é a diferença entre int, Int16, Int32 e Int64?


229

Qual é a diferença entre int, System.Int16, System.Int32e System.Int64diferente de seus tamanhos?

Respostas:


348

Cada tipo de número inteiro tem um intervalo diferente de capacidade de armazenamento

   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 afirma James Sutherland em sua resposta :

inte Int32são realmente sinônimos; intterá uma aparência um pouco mais familiar, Int32tornará a testemunha 32 mais explícita para quem lê seu código. Eu estaria inclinado a usar int onde eu só preciso de 'um número inteiro', Int32onde o tamanho é importante (código criptográfico, estruturas) para que futuros mantenedores saibam que é seguro aumentar um, intse apropriado, mas devem cuidar da alteração de Int32variáveis ​​da mesma maneira .

O código resultante será idêntico: a diferença é puramente de legibilidade ou aparência do código.


1
Se você souber que o valor não excederá 65.535 (assinado) ou -32.768 a 32.767 (não assinado), não seria melhor definir o número inteiro int16para economizar recursos de memória, em vez de simplesmente usar int?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

8
int e int32 podem ser sinônimos, mas não precisam. Atualmente, a maioria dos sistemas vendidos é de 64 bits, e nesse caso um int será de 64 bits.
Martijn Otto

4
Para Matthew T. Baker e quaisquer outros como eu que vieram aqui tentando decidir qual usar do ponto de vista de desempenho, você deve verificar esta postagem que sugere que Integer é mais eficiente que Int16 em muitos casos: stackoverflow.com/questions/129023/ net-integer-vs-int16
Tony L.

19
@MartijnOtto A pergunta está marcada com C #. Em C #, inté sempre Int32 , independentemente do sistema. Talvez você esteja pensando em C ++?

9
@MattBaker: Em geral, em computadores modernos, um int16 ocupa tanto espaço quanto um int32 (e na verdade um int64) porque, para que a maioria das operações seja eficiente, contornamos os dados para tornar os acessos alinhados aos limites de 32 ou 64 bits (nos modos de 32 ou 64 bits, respectivamente). Isso ocorre porque acessos desalinhados são ridiculamente ineficientes em algumas arquiteturas e não são possíveis em outras.
Joel

118

A única diferença real aqui é o tamanho. Todos os tipos int aqui são valores inteiros assinados com tamanhos variados

  • Int16: 2 bytes
  • Int32e int: 4 bytes
  • Int64 : 8 bytes

Há uma pequena diferença entre Int64e o resto. Em uma plataforma de 32 bits, Int64não é garantido que as atribuições a um local de armazenamento sejam atômicas. É garantido para todos os outros tipos.


Se eu usar Int64em 32 bit Windows Operating Systemseguida, quais são as questões que eu poderia enfrentar? Existe algum exemplo?
shaijut 17/06

70

int

É um tipo de dados primitivo definido em C #.

É mapeado para Int32 do tipo FCL.

É um tipo de valor e representa a estrutura System.Int32.

É assinado e leva 32 bits.

Possui um valor mínimo de -2147483648 e um valor máximo de +2147483647.

Int16

É um tipo de FCL.

Em C #, curto é mapeado para Int16.

É um tipo de valor e representa a estrutura System.Int16.

É assinado e leva 16 bits.

Tem um valor mínimo de -32768 e máximo de +32767.

Int32

É um tipo de FCL.

Em C #, int é mapeado para Int32.

É um tipo de valor e representa a estrutura System.Int32.

É assinado e leva 32 bits.

Possui um valor mínimo de -2147483648 e um valor máximo de +2147483647.

Int64

É um tipo de FCL.

Em C #, long é mapeado para Int64.

É um tipo de valor e representa a estrutura System.Int64.

É assinado e leva 64 bits.

Possui um valor mínimo de –9.223.372.036.854.775.808 e máximo de 9.223.372.036.854.775.807.


Apenas para adicionar esse Int64tipo de dados, pode ser representado usando Lou lsufixo enquanto Int16ou Int32não em C #.
RBT

14

De acordo com Jeffrey Richter (um dos colaboradores do .NET framework development), o livro 'CLR via C #':

int é um tipo primitivo permitido pelo compilador C #, enquanto Int32 é o tipo de biblioteca de classes do Framework (disponível em idiomas que obedecem ao CLS). De fato, int se traduz em Int32 durante a compilação.

Além disso,

Em C #, mapas longos para System.Int64, mas em uma linguagem de programação diferente, longos podem ser mapeados para Int16 ou Int32. De fato, C ++ / CLI trata por muito tempo como Int32.

De fato, a maioria das linguagens (.NET) nem tratará por muito tempo uma palavra-chave e não compilarão o código que a usa.

Eu já vi esse autor e muita literatura padrão no .NET que prefere tipos FCL (ou seja, Int32) a tipos primitivos específicos de idioma (ou seja, int), principalmente em questões de interoperabilidade.


8

Nada. A única diferença entre os tipos é seu tamanho (e, portanto, o intervalo de valores que eles podem representar).


8

Uma observação muito importante sobre os tipos 16, 32 e 64:

se você executar esta consulta ... Array.IndexOf (new Int16 [] {1,2,3}, 1)

você deve obter zero (0) porque está perguntando ... é 1 na matriz de 1, 2 ou 3. se você obtiver -1 como resposta, significa que 1 não está na matriz de 1, 2 ou 3 .

Bem, confira o que eu encontrei: Todos os itens a seguir devem fornecer 0 e não -1 (eu testei isso em todas as versões 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)

Portanto, o que quero dizer é que, para comparações Array.IndexOf, confie apenas no Int32!


7
Para esclarecer por que o primeiro exemplo funciona dessa maneira: o primeiro literal 1, o 2 e o 3 são convertidos implicitamente shortpara ajustá-los à matriz, enquanto o segundo literal 1 é deixado como um ordinário int. (int)1não é considerada igual a (short)1, (short)2, (short)3,, assim, o resultado é -1.

4
Haveria um ajuste semelhante disponível para as versões do C #, mas, para sua informação, um especificador de tipo simples corrige esse 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)todos funcionam como esperado.
Mark Hurd

1
E aqueles que não funcionam usaram a Object[],Objectsobrecarga. O C # está implicitamente aumentando a intpara a longquando necessário (e também aumenta a shortpara a intou long), mas não será implicitamente eliminado, usando a objectsobrecarga. With Option Strict Onou OffVB usará apenas a sobrecarga digitada quando fornecidos os tipos uniformes, caso contrário, ela usará a objectsobrecarga.
Mark Hurd

Sua resposta é enganosa. O código está comparando valores de diferentes tipos. A conclusão for Array.IndexOf comparisons, only trust Int32!está errada. Se você converter o 1argumento final no tipo Array correspondente, ele funcionará conforme o esperado.
Don Cheadle

Este é um comportamento muito interessante e inesperado (já que o int para trabalhos longos, mas curto para o int não), portanto o voto positivo!
precisa saber é o seguinte

7

EDIT: Isso não é verdade para C #, uma marca que eu perdi quando respondi a essa pergunta - se houver uma resposta mais específica em C #, vote nela!


Todos eles representam números inteiros de tamanhos variados.

No entanto, há uma diferença muito pequena.

int16, int32 e int64 todos têm um tamanho fixo .

O tamanho de um int depende da arquitetura que você está compilando - a especificação C define apenas um int como maior ou igual a um curto, embora na prática seja a largura do processador que você está alvejando, que provavelmente é de 32 bits, mas você deve saber que pode não ser.


1
Esta deve ser a resposta aceita como este é o único que é realmente correto
MJS

2
Não, isso não é verdade para C #. AC # int sempre tem tamanho de 32 bits. Para C, sim, você tinha que lidar com essa complicação e costuma ver macros no código C para lidar com tamanhos variáveis ​​de int. Veja ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf página 18.
Ananke

@Ananke Ahh, perdeu a tag C #. Gostaria de poder reverter alguns votos nas respostas .....
MJS

6
  1. inte int32são iguais (número inteiro de 32 bits)
  2. int16 é int curto (2 bytes ou 16 bits)
  3. int64 é o tipo de dados longo (8 bytes ou 64 bits)

2
Não é garantido que int seja de 32 bits.
MJS

8
@js, isso simplesmente não é verdade. Em C #, inté um alias para Int32e, portanto, sempre é garantido que seja 32 bits.
David Arno

Na verdade, o que o mjs diz que está correto, INT significa número inteiro com base no sistema x86 ou x64, portanto, se o sistema for x64, int será Int64, portanto não será garantido que seja 32. Se você colocar int32 em um x64, será sempre int32 .
Yogurtu 06/04

5
Não, o que David Arno diz está correto. A linguagem C # define especificamente 'int' como um número inteiro de 32 bits (Int32). Outros idiomas (C / C ++, etc.) podem não especificar isso, mas esta pergunta está marcada com 'C #'.
Theo Brinkman

@TheoBrinkman Correto, aqui está a página da Microsoft nos tipos numéricos integrais de C # s: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Max Barraclough

5

Ambos são de fato sinônimos, mas eu achei a pequena diferença entre eles,

1) Você não pode usar Int32enquanto criaenum

enum Test : Int32
{ XXX = 1   // gives you compilation error
}

enum Test : int
{ XXX = 1   // Works fine
}

2) Int32vem sob a declaração do sistema. Se você remover, using.Systemvocê receberá um erro de compilação, mas não no caso deint


-8

Int = Int32 -> Tipo longo original

Int16 -> Original int

Int64 -> Novo tipo de dados fica disponível após sistemas de 64 bits

"int" está disponível apenas para compatibilidade com versões anteriores. Deveríamos realmente usar novos tipos de int para tornar nossos programas mais precisos.

---------------

Mais uma coisa que notei ao longo do caminho é que não há uma classe chamada Intsemelhante ao Int16, Int32 e Int64. Todas as funções úteis como TryParsepara número inteiro vêm Int32.TryParse.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.