Sobes.tech
Junior

Was ist der Unterschied zwischen den Typen uint und int in der Programmiersprache Go?

sobes.tech KI

Antwort von AI

Die Typen uint und int in Go stellen Ganzzahltypen dar, unterscheiden sich jedoch im Wertebereich und ihrer Bedeutung (vorzeichenbehaftet/vorzeichenlos).

int (vorzeichenbehaftet):

  • Kann positive, negative Zahlen sowie Null speichern.
  • Die Größe in Bits (und somit der Bereich) hängt von der Architektur des Computers ab (32 oder 64 Bit). Auf einer 32-Bit-Architektur sind es 32 Bits, auf einer 64-Bit-Architektur 64 Bits.
  • Bereich: von -2<sup>n-1</sup> bis 2<sup>n-1</sup> - 1, wobei n die Anzahl der Bits ist.

uint (vorzeichenlos):

  • Kann nur nicht-negative Zahlen speichern, beginnend bei Null.
  • Die Größe in Bits hängt ebenfalls von der Architektur des Computers ab (32 oder 64 Bit) und entspricht der Größe von int.
  • Bereich: von 0 bis 2<sup>n</sup> - 1, wobei n die Anzahl der Bits ist.

Der Hauptunterschied besteht darin, dass int ein Bit für das Vorzeichen verwendet (positive oder negative Zahl), während uint alle Bits für die Darstellung des Zahlenwerts nutzt. Dies ermöglicht uint, einen maximal positiven Bereich zu speichern, der doppelt so groß ist wie bei int gleicher Größe.

Bei der Wahl zwischen int und uint sollte man berücksichtigen:

  • Ob die Zahl negativ sein könnte. Falls ja, verwenden Sie int.
  • Ob ein maximaler positiver Bereich benötigt wird. Falls ja und negative Werte nicht erforderlich sind, ist uint möglicherweise geeignet.
  • Der Typ uint wird häufig zur Darstellung von Bitmasken, Identifikatoren, Größen oder Mengen verwendet, die per Natur nicht negativ sein können.
// int kann negativ sein
var signedInt int = -10
// uint kann nicht negativ sein
// var unsignedInt uint = -10 // Kompilierungsfehler

// Maximale Werte (auf einem 64-Bit-System)
// fmt.Println(math.MaxInt64)  // 9223372036854775807
// fmt.Println(math.MaxUint64) // 18446744073709551615 (ungefähr doppelt so groß)

// Implizite Konvertierung ist zwischen int und uint nicht möglich
var a int = 5
var b uint = 5
// if a == b { ... } // Fehler: Typinkompatibilität ohne explizite Konvertierung

// Explizite Konvertierung
var c int = 10
var d uint = uint(c)

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