Sobes.tech
Junior

Care este diferența dintre tipurile uint și int în limbajul Go?

sobes.tech AI

Răspuns de la AI

Tipurile uint și int în Go reprezintă tipuri de date întregi, dar diferă în intervalul valorilor posibile și în semnificația lor (cu semn/ fără semn).

int (întreg cu semn):

  • Poate stoca numere pozitive, negative și zero.
  • Dimensiunea în biți (și, prin urmare, intervalul) depinde de arhitectura calculatorului (32 sau 64 de biți). Pe o arhitectură de 32 de biți, este de 32 de biți, pe una de 64 de biți - de 64 de biți.
  • Interval: de la -2<sup>n-1</sup> până la 2<sup>n-1</sup> - 1, unde n este numărul de biți.

uint (întreg fără semn):

  • Poate stoca doar numere nenegative, începând de la zero.
  • Dimensiunea în biți depinde, de asemenea, de arhitectura calculatorului (32 sau 64 de biți) și corespunde dimensiunii lui int.
  • Interval: de la 0 până la 2<sup>n</sup> - 1, unde n este numărul de biți.

Diferența principală este că int folosește un bit pentru reprezentarea semnului (număr pozitiv sau negativ), în timp ce uint folosește toți biții pentru reprezentarea valorii numărului. Acest lucru permite uint să stocheze un interval maxim pozitiv de două ori mai mare comparativ cu int de aceeași dimensiune.

La alegerea între int și uint, trebuie să țineți cont de:

  • Dacă se preconizează că numărul poate fi negativ. Dacă da, folosiți int.
  • Dacă este necesar un interval pozitiv maxim. Dacă da și valorile negative nu sunt necesare, poate fi potrivit uint.
  • Tipul uint este adesea folosit pentru reprezentarea măștilor de biți, identificatori, dimensiuni sau cantități care, prin natura lor, nu pot fi negative.
// int poate fi negativ
var signedInt int = -10
// uint nu poate fi negativ
// var unsignedInt uint = -10 // Eroare de compilare

// Valori maxime (pe un sistem de 64 de biți)
// fmt.Println(math.MaxInt64)  // 9223372036854775807
// fmt.Println(math.MaxUint64) // 18446744073709551615 (aproximativ de două ori mai mare)

// Conversia implicită nu este posibilă între int și uint
var a int = 5
var b uint = 5
// if a == b { ... } // Eroare: incompatibilitate de tipuri fără conversie explicită

// Conversie explicită
var c int = 10
var d uint = uint(c)

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