Qual é a diferença entre int, System.Int16, System.Int32e System.Int64diferente de seus tamanhos?
Qual é a diferença entre int, System.Int16, System.Int32e System.Int64diferente de seus tamanhos?
Respostas:
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 :
inteInt32sã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 deInt32variáveis da mesma maneira .O código resultante será idêntico: a diferença é puramente de legibilidade ou aparência do código.
inté sempre Int32 , independentemente do sistema. Talvez você esteja pensando em C ++?
A única diferença real aqui é o tamanho. Todos os tipos int aqui são valores inteiros assinados com tamanhos variados
Int16: 2 bytesInt32e int: 4 bytesInt64 : 8 bytesHá 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.
Int64em 32 bit Windows Operating Systemseguida, quais são as questões que eu poderia enfrentar? Existe algum exemplo?
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.
Int64tipo de dados, pode ser representado usando Lou lsufixo enquanto Int16ou Int32não em C #.
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.
Nada. A única diferença entre os tipos é seu tamanho (e, portanto, o intervalo de valores que eles podem representar).
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!
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.
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.
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.
for Array.IndexOf comparisons, only trust Int32!está errada. Se você converter o 1argumento final no tipo Array correspondente, ele funcionará conforme o esperado.
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.
inte int32são iguais (número inteiro de 32 bits)int16 é int curto (2 bytes ou 16 bits)int64 é o tipo de dados longo (8 bytes ou 64 bits)inté um alias para Int32e, portanto, sempre é garantido que seja 32 bits.
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
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.
int16para economizar recursos de memória, em vez de simplesmente usarint?