Sobes.tech
Junior

Qual è la differenza tra i tipi uint e int nel linguaggio Go?

sobes.tech AI

Risposta dell'AI

I tipi uint e int in Go rappresentano tipi di dati interi, ma differiscono per l'intervallo di valori possibili e il loro significato (signed/unsigned).

int (intero con segno):

  • Può contenere numeri positivi, negativi e zero.
  • La dimensione in bit (e, di conseguenza, l'intervallo) dipende dall'architettura del computer (32 o 64 bit). Su un'architettura a 32 bit, è 32 bit, su una a 64 bit, è 64 bit.
  • Intervallo: da -2<sup>n-1</sup> a 2<sup>n-1</sup> - 1, dove n è il numero di bit.

uint (intero senza segno):

  • Può contenere solo numeri non negativi, a partire da zero.
  • La dimensione in bit dipende anche dall'architettura del computer (32 o 64 bit) e corrisponde alla dimensione di int.
  • Intervallo: da 0 a 2<sup>n</sup> - 1, dove n è il numero di bit.

La principale differenza è che int utilizza un bit per rappresentare il segno (numero positivo o negativo), mentre uint utilizza tutti i bit per rappresentare il valore del numero. Questo permette a uint di memorizzare un intervallo massimo positivo doppio rispetto a int della stessa dimensione.

Nella scelta tra int e uint, si dovrebbe considerare:

  • Se si prevede che il numero possa essere negativo. Se sì, usare int.
  • Se è necessario un intervallo positivo massimo. Se sì e i valori negativi non sono necessari, potrebbe essere adatto uint.
  • Il tipo uint viene spesso usato per rappresentare maschere di bit, identificatori, dimensioni o quantità che per loro natura non possono essere negative.
// int può essere negativo
var signedInt int = -10
// uint non può essere negativo
// var unsignedInt uint = -10 // Errore di compilazione

// Valori massimi (su un sistema a 64 bit)
// fmt.Println(math.MaxInt64)  // 9223372036854775807
// fmt.Println(math.MaxUint64) // 18446744073709551615 (circa il doppio)

// La conversione implicita non è possibile tra int e uint
var a int = 5
var b uint = 5
// if a == b { ... } // Errore: incompatibilità di tipi senza conversione esplicita

// Conversione esplicita
var c int = 10
var d uint = uint(c)

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