Riepilogo rapido:
import "math/bits"
const (
MaxUint uint = (1 << bits.UintSize) - 1
MaxInt int = (1 << bits.UintSize) / 2 - 1
MinInt int = (1 << bits.UintSize) / -2
)
Sfondo:
Come presumo tu sappia, il uint
tipo ha le stesse dimensioni di uno uint32
o uint64
, a seconda della piattaforma su cui ti trovi. Di solito, si userebbe la versione non dimensionata di questi solo quando non vi è alcun rischio di avvicinarsi al valore massimo, poiché la versione senza una specifica di dimensione può utilizzare il tipo "nativo", a seconda della piattaforma, che tende ad essere più veloce.
Si noti che tende ad essere "più veloce" perché l'utilizzo di un tipo non nativo richiede talvolta l'esecuzione di ulteriori controlli matematici e di limiti da parte del processore, al fine di emulare il numero intero più grande o più piccolo. Tenendo presente ciò, tieni presente che le prestazioni del processore (o del codice ottimizzato del compilatore) saranno quasi sempre migliori rispetto all'aggiunta del tuo codice di controllo dei limiti, quindi se c'è qualche rischio che entri in gioco, potrebbe rendere ha senso usare semplicemente la versione di dimensioni fisse e lasciare che l'emulazione ottimizzata gestisca eventuali ricadute.
Detto questo, ci sono ancora alcune situazioni in cui è utile sapere con cosa stai lavorando.
Il pacchetto " matematica / bit " contiene la dimensione di uint
, in bit. Per determinare il valore massimo, spostare 1
di quel numero di bit, meno 1. cioè:(1 << bits.UintSize) - 1
Si noti che quando si calcola il valore massimo di uint
, in genere è necessario inserirlo esplicitamente in una uint
(o più grande) variabile, altrimenti il compilatore potrebbe non riuscire, poiché per impostazione predefinita si tenterà di assegnare quel calcolo in un segno int
(dove, come dovrebbe essere ovvio, non si adatterebbe), quindi:
const MaxUint uint = (1 << bits.UintSize) - 1
Questa è la risposta diretta alla tua domanda, ma ci sono anche un paio di calcoli correlati che potrebbero interessarti.
Secondo le specifiche , uint
e int
hanno sempre le stesse dimensioni.
uint
32 o 64 bit
int
stesse dimensioni di uint
Quindi possiamo anche usare questa costante per determinare il valore massimo di int
, prendendo quella stessa risposta e dividendola 2
poi sottraendo 1
. vale a dire:(1 << bits.UintSize) / 2 - 1
E il valore minimo di int
, spostando 1
per molti bit e dividendo il risultato per -2
. vale a dire:(1 << bits.UintSize) / -2
In sintesi:
MaxUint: (1 << bits.UintSize) - 1
MaxInt: (1 << bits.UintSize) / 2 - 1
MININT: (1 << bits.UintSize) / -2
esempio completo (dovrebbe essere lo stesso di seguito)
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
estratto da golang.org/doc/effective_go.html#printing