Kurze Zusammenfassung:
import "math/bits"
const (
MaxUint uint = (1 << bits.UintSize) - 1
MaxInt int = (1 << bits.UintSize) / 2 - 1
MinInt int = (1 << bits.UintSize) / -2
)
Hintergrund:
Wie Sie wahrscheinlich wissen, hat der uint
Typ die gleiche Größe wie entweder uint32
oder uint64
, abhängig von der Plattform, auf der Sie sich befinden. Normalerweise würde man die nicht dimensionierte Version davon nur verwenden, wenn kein Risiko besteht, sich dem Maximalwert anzunähern, da die Version ohne Größenangabe je nach Plattform den "nativen" Typ verwenden kann, der tendenziell schneller ist.
Beachten Sie, dass es tendenziell "schneller" ist, da die Verwendung eines nicht nativen Typs manchmal zusätzliche Berechnungen und Grenzüberprüfungen durch den Prozessor erfordert, um die größere oder kleinere Ganzzahl zu emulieren. Beachten Sie vor diesem Hintergrund, dass die Leistung des Prozessors (oder des optimierten Codes des Compilers) fast immer besser ist als das Hinzufügen eines eigenen Codes zur Überprüfung der Grenzen. Wenn also das Risiko besteht, dass dieser ins Spiel kommt, kann dies zu einer Beeinträchtigung führen Es ist sinnvoll, einfach die Version mit fester Größe zu verwenden und die optimierte Emulation alle daraus resultierenden Folgen bewältigen zu lassen.
Nachdem dies gesagt wurde, gibt es immer noch Situationen, in denen es nützlich ist zu wissen, mit was Sie arbeiten.
Das Paket " math / bits " enthält die Größe von uint
in Bits. Um den Maximalwert zu bestimmen, verschieben Sie 1
um so viele Bits minus 1. Das heißt:(1 << bits.UintSize) - 1
Beachten Sie, dass Sie bei der Berechnung des Maximalwerts von im uint
Allgemeinen explizit in eine uint
(oder eine größere) Variable einfügen müssen, da der Compiler sonst möglicherweise fehlschlägt, da standardmäßig versucht wird, diese Berechnung einer signierten int
(wo, wie sollte) zuzuweisen offensichtlich sein, es würde nicht passen), also:
const MaxUint uint = (1 << bits.UintSize) - 1
Das ist die direkte Antwort auf Ihre Frage, aber es gibt auch einige verwandte Berechnungen, an denen Sie interessiert sein könnten.
Gemäß der Spezifikation , uint
und int
sind immer gleich groß.
uint
entweder 32 oder 64 Bit
int
gleiche Größe wie uint
Wir können diese Konstante also auch verwenden, um den Maximalwert von zu bestimmen int
, indem wir dieselbe Antwort nehmen und durch 2
Subtrahieren dividieren 1
. dh:(1 << bits.UintSize) / 2 - 1
Und der Minimalwert von int
durch Verschieben 1
um so viele Bits und Teilen des Ergebnisses durch -2
. dh:(1 << bits.UintSize) / -2
Zusammenfassend:
MaxUint: (1 << bits.UintSize) - 1
MaxInt: (1 << bits.UintSize) / 2 - 1
MinInt: (1 << bits.UintSize) / -2
vollständiges Beispiel (sollte das gleiche sein wie unten)
package main
import "fmt"
import "math"
import "math/bits"
func main() {
var mi32 int64 = math.MinInt32
var mi64 int64 = math.MinInt64
var i32 uint64 = math.MaxInt32
var ui32 uint64 = math.MaxUint32
var i64 uint64 = math.MaxInt64
var ui64 uint64 = math.MaxUint64
var ui uint64 = (1 << bits.UintSize) - 1
var i uint64 = (1 << bits.UintSize) / 2 - 1
var mi int64 = (1 << bits.UintSize) / -2
fmt.Printf(" MinInt32: %d\n", mi32)
fmt.Printf(" MaxInt32: %d\n", i32)
fmt.Printf("MaxUint32: %d\n", ui32)
fmt.Printf(" MinInt64: %d\n", mi64)
fmt.Printf(" MaxInt64: %d\n", i64)
fmt.Printf("MaxUint64: %d\n", ui64)
fmt.Printf(" MaxUint: %d\n", ui)
fmt.Printf(" MinInt: %d\n", mi)
fmt.Printf(" MaxInt: %d\n", i)
}
int(^uint(0) >> 1) // largest int
das aus golang.org/doc/effective_go.html#printing