Sobes.tech
Junior

Qual é a diferença entre os tipos uint e int na linguagem Go?

sobes.tech IA

Resposta da IA

Os tipos uint e int em Go representam tipos de dados inteiros, mas diferem no intervalo de valores possíveis e no seu significado (com sinal/sem sinal).

int (inteiro com sinal):

  • Pode armazenar números positivos, negativos e zero.
  • O tamanho em bits (e, portanto, o intervalo) depende da arquitetura do computador (32 ou 64 bits). Em uma arquitetura de 32 bits, é 32 bits, e em uma de 64 bits, é 64 bits.
  • Intervalo: de -2<sup>n-1</sup> até 2<sup>n-1</sup> - 1, onde n é o número de bits.

uint (inteiro sem sinal):

  • Pode armazenar apenas números não negativos, começando do zero.
  • O tamanho em bits também depende da arquitetura do computador (32 ou 64 bits) e corresponde ao tamanho de int.
  • Intervalo: de 0 até 2<sup>n</sup> - 1, onde n é o número de bits.

A principal diferença é que int usa um bit para representar o sinal (positivo ou negativo), enquanto que uint usa todos os bits para representar o valor do número. Isso permite que uint armazene um intervalo máximo positivo duas vezes maior em comparação com int do mesmo tamanho.

Ao escolher entre int e uint, deve-se considerar:

  • Se o número pode ser negativo. Se sim, use int.
  • Se é necessário um intervalo positivo máximo. Se não, e valores negativos não são necessários, uint pode ser adequado.
  • O tipo uint é frequentemente usado para representar máscaras de bits, identificadores, tamanhos ou quantidades que, por sua natureza, não podem ser negativos.
// int pode ser negativo
var signedInt int = -10
// uint não pode ser negativo
// var unsignedInt uint = -10 // Erro de compilação

// Valores máximos (em um sistema de 64 bits)
// fmt.Println(math.MaxInt64)  // 9223372036854775807
// fmt.Println(math.MaxUint64) // 18446744073709551615 (aproximadamente o dobro)

// A conversão implícita não é possível entre int e uint
var a int = 5
var b uint = 5
// if a == b { ... } // Erro: incompatibilidade de tipos sem conversão explícita

// Conversão explícita
var c int = 10
var d uint = uint(c)

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