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
uintse č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)