Junior
Aký je rozdiel medzi typmi uint a int v jazyku Go?
sobes.tech AI
Odpoveď od AI
Typy uint a int v jazyku Go predstavujú celé číselné typy, ale líšia sa rozsahom možných hodnôt a ich významom (so znamienkom/bez znamienka).
int (znamienkové celé číslo):
- Môže ukladať kladné, záporné čísla a nulu.
- Veľkosť v bitoch (a tým aj rozsah) závisí od architektúry počítača (32 alebo 64 bitov). Na 32-bitovej architektúre je to 32 bitov, na 64-bitovej - 64 bitov.
- Rozsah: od -2<sup>n-1</sup> do 2<sup>n-1</sup> - 1, kde n je počet bitov.
uint (bez znamienka):
- Môže ukladať iba ne-negatívne čísla, začínajúc od nuly.
- Veľkosť v bitoch závisí aj od architektúry počítača (32 alebo 64 bitov) a zodpovedá veľkosti
int. - Rozsah: od 0 do 2<sup>n</sup> - 1, kde n je počet bitov.
Hlavný rozdiel spočíva v tom, že int používa jeden bit na reprezentáciu znamienka (kladné alebo záporné číslo), zatiaľ čo uint používa všetky bity na reprezentáciu hodnoty čísla. To umožňuje uint uložiť dvojnásobne väčší maximálny kladný rozsah v porovnaní s int rovnakej veľkosti.
Pri výbere medzi int a uint je potrebné zvážiť:
- Či je možné, že číslo bude záporné. Ak áno, použite
int. - Či je potrebný maximálny kladný rozsah. Ak áno a záporné hodnoty nie sú potrebné, môže byť vhodný
uint. - Typ
uintsa často používa na reprezentáciu bitových masiek, identifikátorov, veľkostí alebo množstiev, ktoré zo svojej podstaty nemôžu byť záporné.
// int môže byť záporné
var signedInt int = -10
// uint nemôže byť záporné
// var unsignedInt uint = -10 // Chyba kompilácie
// Maximálne hodnoty (na 64-bitovom systéme)
// fmt.Println(math.MaxInt64) // 9223372036854775807
// fmt.Println(math.MaxUint64) // 18446744073709551615 (približne dvojnásobok)
// Implicitná konverzia nie je možná medzi int a uint
var a int = 5
var b uint = 5
// if a == b { ... } // Chyba: nekompatibilita typov bez explicitnej konverzie
// Explicitná konverzia
var c int = 10
var d uint = uint(c)
var e uint = 20
var f int = int(e)