Qual é a diferença entre “int” e “uint” / “long” e “ulong”?

118

Eu sei sobre inte long(números de 32 e 64 bits), mas o que são uinte ulong?

Motor Diferença
fonte

Respostas:

224

Os tipos de dados primitivos prefixados com "u" são versões não assinadas com os mesmos tamanhos de bits. Efetivamente, isso significa que eles não podem armazenar números negativos, mas, por outro lado, podem armazenar números positivos duas vezes maiores que seus equivalentes assinados. As contrapartes assinadas não têm o prefixo "u".

Os limites para int (32 bits) são:

int: 2147483648 to 2147483647 
uint: 0 to 4294967295 

E por muito tempo (64 bits):

long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615
Isak Savo
fonte
12
Isso é muito divertido de fazer à mão. Uma variável com sinal de 32 bits usa 1 bit para o sinal (positivo ou negativo), portanto pode armazenar valores entre -2 ^ 31 e + 2 ^ 31 - 1
Jaco Pretorius
ao comparar int e uint para uso, qual é viável?
Arun Prasad
Qual é o equivalente em c ++?
darkgaze de
@JacoPretorius Isso está errado. O int de 8 bits tem um intervalo de –128 a 127. O 9º bit representa 256. Portanto, com 8 bits você pode representar todos os valores até 255 (9º val - 1). O intervalo de -128 a 127 tem um comprimento de exatamente 255. Portanto, não há bit que mantenha o sinal. Todos os valores até 127 são positivos. Os valores acima são exibidos negativos. 255 seria -1. 254 seria -2 e então uma descida para 128.
C4d
Acho que também é importante notar que, especificamente para int vs uint, o inteiro não assinado não é compatível com CLS e é recomendado usar int sempre que possível.
db2
38

uinte ulongsão as versões não assinadas de inte long. Isso significa que eles não podem ser negativos. Em vez disso, eles têm um valor máximo maior.

Tipo Mín. Máx. Em conformidade com CLS
int -2.147.483.648 2.147.483.647 Sim
uint 0 4.294.967.295 Não
long –9.223.372.036.854.775.808 9.223.372.036.854.775.807 Sim
ulong 0 18.446.744.073.709.551.615 No

Para escrever um int literal sem sinal em seu código-fonte, você pode usar o sufixo uou, Upor exemplo 123U.

Você não deve usar uint e ulong em sua interface pública se desejar ser compatível com CLS .

Leia a documentação para mais informações:

A propósito, também há short e ushort e byte e sbyte .

Mark Byers
fonte
Isso é interessante - o que você quer dizer com compatibilidade com CLS? O link leva à documentação do MSDN para int. Se por "CLS" você quer dizer as especificações da linguagem C #, então eu não entendo - a especificação descreve claramente uint e ulong (seção 1.3)
Isak Savo
1
@Isak Savo: É importante ser compatível com CLS se você estiver escrevendo uma interface que possa ser usada por outras linguagens .NET além do C #.
Mark Byers
Curioso que você mencione curto e ushort, mas deixe de fora byte e sbyte :)
Roman Starkov
10

usignifica unsigned, então ulongé um grande número sem sinal. Você pode armazenar um valor maior em ulongque long, mas não são permitidos números negativos.

Um longvalor é armazenado em 64 bits, com seu primeiro dígito para mostrar se é um número positivo / negativo. enquanto ulongtambém é de 64 bits, com todos de 64 bits para armazenar o número. portanto, o máximo de ulong é 2 (64) -1, enquanto long é 2 (63) -1.

Cheng Chen
fonte
9

A diferença é que uinte ulongsão tipos de dados sem sinal, o que significa que o intervalo é diferente: Eles não aceitam valores negativos:

int range: -2,147,483,648 to 2,147,483,647
uint range: 0 to 4,294,967,295

long range: 9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
ulong range: 0 to 18,446,744,073,709,551,615
srodriguez
fonte