Sobes.tech
Junior

Jaký je rozdíl mezi typy uint a int v jazyce Go?

sobes.tech AI

Odpověď od AI

Typy uint a int v jazyce Go představují celočíselné datové typy, ale liší se rozsahem možných hodnot a jejich významem (se znaménkem/bez znaménka).

int (znaménkový celé číslo):

  • Může uchovávat kladná, záporná čísla a nulu.
  • Velikost v bitech (a tím i rozsah) závisí na architektuře počítače (32 nebo 64 bitů). Na 32bitové architektuře je to 32 bitů, na 64bitové architektuře 64 bitů.
  • Rozsah: od -2<sup>n-1</sup> do 2<sup>n-1</sup> - 1, kde n je počet bitů.

uint (bez znaménka):

  • Může uchovávat pouze nezáporná čísla, začínající od nuly.
  • Velikost v bitech závisí také na architektuře počítače (32 nebo 64 bitů) a odpovídá velikosti int.
  • Rozsah: od 0 do 2<sup>n</sup> - 1, kde n je počet bitů.

Hlavní rozdíl spočívá v tom, že int používá jeden bit k reprezentaci znaménka (kladné nebo záporné číslo), zatímco uint používá všechny bity k reprezentaci hodnoty čísla. To umožňuje uint uložit dvojnásobný maximální kladný rozsah ve srovnání s int stejné velikosti.

Při výběru mezi int a uint je třeba vzít v úvahu:

  • Je-li pravděpodobné, že číslo může být záporné. Pokud ano, použijte int.
  • Je-li potřeba maximální kladný rozsah. Pokud ano a záporné hodnoty nejsou potřeba, může být vhodný uint.
  • Typ uint se často používá k reprezentaci bitových masek, identifikátorů, velikostí nebo množství, které svou povahou nemohou být záporné.
// int může být záporné
var signedInt int = -10
// uint nemůže být záporné
// var unsignedInt uint = -10 // Chyba kompilace

// Maximální hodnoty (na 64bitovém systému)
// fmt.Println(math.MaxInt64)  // 9223372036854775807
// fmt.Println(math.MaxUint64) // 18446744073709551615 (přibližně dvojnásobek)

// Implicitní konverze není možná mezi int a uint
var a int = 5
var b uint = 5
// if a == b { ... } // Chyba: neslučitelnost typů bez explicitní konverze

// Explicitní konverze
var c int = 10
var d uint = uint(c)

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