¿Cuál es la diferencia entre "int" y "uint" / "long" y "ulong"?

Respuestas:

224

Los tipos de datos primitivos con el prefijo "u" son versiones sin firmar con los mismos tamaños de bits. Efectivamente, esto significa que no pueden almacenar números negativos, pero por otro lado pueden almacenar números positivos dos veces más grandes que sus contrapartes con signo. Las contrapartes firmadas no tienen el prefijo "u".

Los límites para int (32 bits) son:

int: 2147483648 to 2147483647 
uint: 0 to 4294967295 

Y por mucho tiempo (64 bits):

long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615
Isak Savo
fuente
12
Es muy divertido hacer esto a mano. Una variable con signo de 32 bits usa 1 bit para el signo (positivo o negativo), por lo que puede almacenar valores entre -2 ^ 31 y + 2 ^ 31 - 1
Jaco Pretorius
al comparar int y uint para su uso, ¿cuál es factible?
Arun Prasad
¿Cuál es el equivalente en c ++?
mirada oscura
@JacoPretorius Eso está mal. 8 bits int tiene un rango de –128 a 127. El noveno bit representa 256. Por lo tanto, con 8 bits puede representar todos los valores hasta 255 (noveno val - 1). El rango de -128 a 127 tiene una longitud de exactamente 255. Por lo tanto, no hay ningún bit que contenga el signo. Todos los valores hasta 127 son positivos. Los valores anteriores se muestran negativos. 255 sería -1. 254 sería -2 y, por lo tanto, un camino hacia 128.
C4d
Creo que también vale la pena señalar que, específicamente para int vs uint, el entero sin firmar no es compatible con CLS, y se recomienda usar int con la mayor frecuencia posible.
db2
38

uinty ulongson las versiones sin firmar deint y long. Eso significa que no pueden ser negativos. En cambio, tienen un valor máximo mayor.

Tipo Mín. Máx. Cumple con CLS
int -2,147,483,648 2,147,483,647 Sí
uint 0 4.294.967.295 No
largo –9,223,372,036,854,775,808 9,223,372,036,854,775,807 Sí
ulong 0 18,446,744,073,709,551,615 No

Para escribir un int literal sin firmar en su código fuente, puede usar el sufijo uo, Upor ejemplo 123U.

No debe usar uint y ulong en su interfaz pública si desea cumplir con CLS .

Lea la documentación para obtener más información:

Por cierto, también hay short y ushort y byte y sbyte .

Mark Byers
fuente
Esto es interesante, ¿qué quiere decir con el cumplimiento de CLS? El enlace va a la documentación de MSDN para int. Si por "CLS" te refieres a la especificación del lenguaje C #, entonces no entiendo; la especificación describe claramente tanto a uint como a ulong (sección 1.3)
Isak Savo
1
@Isak Savo: Es importante ser compatible con CLS si está escribiendo una interfaz que podría ser utilizada por otros lenguajes .NET además de C #.
Mark Byers
Es curioso que menciones short y ushort, pero omitas byte y sbyte :)
Roman Starkov
10

usignifica unsigned, también lo ulonges un gran número sin signo. Puede almacenar un valor mayor en ulongque long, pero no se permiten números negativos.

Un longvalor se almacena en 64 bits, con su primer dígito para mostrar si es un número positivo / negativo. mientras ulongque también es de 64 bits, con todos los de 64 bits para almacenar el número. por lo que el máximo de ulong es 2 (64) -1, mientras que long es 2 (63) -1.

Cheng Chen
fuente
9

La diferencia es que uinty ulongson tipos de datos sin firmar, lo que significa que el rango es diferente: no aceptan 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
fuente