Sobes.tech
Junior

Mis vahe on uint ja int tüüpide vahel Go keeles?

sobes.tech AI

Vastus AI-lt

Go uint ja int tüübid tähistavad täisarve, kuid erinevad nende väärtuste vahemiku ja tähenduse poolest (märgitud/märgimata).

int (märgitud):

  • Võib salvestada positiivseid ja negatiivseid numbreid ning nulli.
  • Bittide arv (ja seega vahemik) sõltub arvutiarhitektuurist (32 või 64 bitti). 32-bitisel arhitektuuril on see 32 bitti, 64-bitisel - 64 bitti.
  • Vahemik: alates -2<sup>n-1</sup> kuni 2<sup>n-1</sup>-1, kus n on bittide arv.

uint (märgimata täisarv):

  • Võib salvestada ainult mitte-negatiivseid numbreid, alates nullist.
  • Bittide arv sõltub samuti arhitektuurist (32 või 64 bitti) ning vastab int-i suurusele.
  • Vahemik: alates 0 kuni 2<sup>n</sup>-1, kus n on bittide arv.

Peamine erinevus on see, et int kasutab ühe bitti märgi jaoks (positiivne või negatiivne arv), samas kui uint kasutab kõiki bite arvväärtuse esitamiseks. See võimaldab uint-il salvestada kahekordse suurusega positiivse vahemiku sama suurusega int-i puhul.

Valides int ja uint vahel, tuleks arvestada:

  • Kas arv võib olla negatiivne? Kui jah, kasutage int.
  • Kas on vaja maksimaalset positiivset vahemikku? Kui jah ja negatiivseid väärtusi pole vaja, võib sobida uint.
  • uint kasutatakse sageli bittmaskide, identifikaatorite, suuruste või koguste esitamiseks, mis loomult ei saa olla negatiivsed.
// int võib olla negatiivne
var signedInt int = -10
// uint ei saa olla negatiivne
// var unsignedInt uint = -10 // Kompilatsiooniviga

// Maksimaalsed väärtused (64-bitisel süsteemil)
// fmt.Println(math.MaxInt64)  // 9223372036854775807
// fmt.Println(math.MaxUint64) // 18446744073709551615 (peaaegu kahekordne)

// Otse konverteerimine int ja uint vahel ei ole võimalik
var a int = 5
var b uint = 5
// if a == b { ... } // Viga: tüübid ei ühti, vaja selget konversiooni

// Selge konversioon
var c int = 10
var d uint = uint(c)

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