Junior
Quelle est la différence entre les types uint et int dans le langage Go?
sobes.tech IA
Réponse de l'IA
Les types uint et int en Go représentent des types de données entiers, mais diffèrent par la plage de valeurs possibles et leur signification (signé/sans signe).
int (entier signé) :
- Peut stocker des nombres positifs, négatifs et zéro.
- La taille en bits (et donc la plage) dépend de l'architecture de l'ordinateur (32 ou 64 bits). Sur une architecture 32 bits, c'est 32 bits, et sur une 64 bits, c'est 64 bits.
- Plage : de -2<sup>n-1</sup> à 2<sup>n-1</sup> - 1, où n est le nombre de bits.
uint (entier sans signe) :
- Peut stocker uniquement des nombres non négatifs, à partir de zéro.
- La taille en bits dépend également de l'architecture de l'ordinateur (32 ou 64 bits) et correspond à la taille de
int. - Plage : de 0 à 2<sup>n</sup> - 1, où n est le nombre de bits.
La principale différence est que int utilise un bit pour représenter le signe (nombre positif ou négatif), tandis que uint utilise tous les bits pour représenter la valeur du nombre. Cela permet à uint de stocker une plage maximale positive deux fois plus grande par rapport à int de même taille.
Lors du choix entre int et uint, il faut considérer :
- Si le nombre peut être négatif. Si oui, utilisez
int. - Si une plage positive maximale est nécessaire. Si non, et que les valeurs négatives ne sont pas nécessaires,
uintpeut convenir. - Le type
uintest souvent utilisé pour représenter des masques de bits, des identifiants, des tailles ou des quantités qui, par leur nature, ne peuvent pas être négatifs.
// int peut être négatif
var signedInt int = -10
// uint ne peut pas être négatif
// var unsignedInt uint = -10 // Erreur de compilation
// Valeurs maximales (sur un système 64 bits)
// fmt.Println(math.MaxInt64) // 9223372036854775807
// fmt.Println(math.MaxUint64) // 18446744073709551615 (environ le double)
// La conversion implicite n'est pas possible entre int et uint
var a int = 5
var b uint = 5
// if a == b { ... } // Erreur : incompatibilité de types sans conversion explicite
// Conversion explicite
var c int = 10
var d uint = uint(c)
var e uint = 20
var f int = int(e)