Sobes.tech
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 uint sa č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)