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
uintviene 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)