Sobes.tech
Junior

¿Cuál es la diferencia entre los tipos uint e int en el lenguaje Go?

sobes.tech AI

Respuesta de la IA

Los tipos uint e int en Go representan tipos de datos enteros, pero difieren en el rango de valores posibles y su significado (con signo/sin signo).

int (entero con signo):

  • Puede almacenar números positivos, negativos y cero.
  • El tamaño en bits (y, por lo tanto, el rango) depende de la arquitectura de la computadora (32 o 64 bits). En una arquitectura de 32 bits, es 32 bits, y en una de 64 bits, es 64 bits.
  • Rango: desde -2<sup>n-1</sup> hasta 2<sup>n-1</sup> - 1, donde n es el número de bits.

uint (entero sin signo):

  • Solo puede almacenar números no negativos, comenzando desde cero.
  • El tamaño en bits también depende de la arquitectura de la computadora (32 o 64 bits) y corresponde al tamaño de int.
  • Rango: desde 0 hasta 2<sup>n</sup> - 1, donde n es el número de bits.

La principal diferencia es que int usa un bit para representar el signo (positivo o negativo), mientras que uint usa todos los bits para representar el valor del número. Esto permite que uint almacene un rango máximo positivo el doble de grande en comparación con int del mismo tamaño.

Al elegir entre int y uint, se debe considerar:

  • Si se espera que el número pueda ser negativo. Si es así, use int.
  • Si se necesita un rango positivo máximo. Si no se necesitan valores negativos, quizás sea adecuado uint.
  • El tipo uint se usa a menudo para representar máscaras de bits, identificadores, tamaños o cantidades que por su naturaleza no pueden ser negativos.
// int puede ser negativo
var signedInt int = -10
// uint no puede ser negativo
// var unsignedInt uint = -10 // Error de compilación

// Valores máximos (en un sistema de 64 bits)
// fmt.Println(math.MaxInt64)  // 9223372036854775807
// fmt.Println(math.MaxUint64) // 18446744073709551615 (aproximadamente el doble)

// La conversión implícita no es posible entre int y uint
var a int = 5
var b uint = 5
// if a == b { ... } // Error: incompatibilidad de tipos sin conversión explícita

// Conversión explícita
var c int = 10
var d uint = uint(c)

var e uint = 20
var f int = int(e)