Résumé rapide :
import "math/bits"
const (
MaxUint uint = (1 << bits.UintSize) - 1
MaxInt int = (1 << bits.UintSize) / 2 - 1
MinInt int = (1 << bits.UintSize) / -2
)
Le contexte :
Comme je suppose que vous le savez, le uint
est de la même taille que l'un ou l'autre uint32
o uint64
en fonction de la plateforme sur laquelle vous vous trouvez. En général, on n'utilise la version sans taille que lorsqu'il n'y a aucun risque de s'approcher de la valeur maximale, car la version sans spécification de taille peut utiliser le type "natif", selon la plate-forme, qui a tendance à être plus rapide.
Notez qu'elle a tendance à être "plus rapide" parce que l'utilisation d'un type non natif nécessite parfois des calculs supplémentaires et un contrôle des limites à effectuer par le processeur, afin d'émuler l'entier plus grand ou plus petit. En gardant cela à l'esprit, sachez que les performances du processeur (ou du code optimisé du compilateur) seront presque toujours meilleures que l'ajout de votre propre code de contrôle des limites, donc s'il y a un risque que cela entre en jeu, il peut être judicieux d'utiliser simplement la version à taille fixe et de laisser l'émulation optimisée gérer toutes les retombées.
Cela dit, il y a toujours des situations où il est utile de savoir avec quoi l'on travaille.
Le paquet " maths/bits "contient la taille de uint
en bits. Pour déterminer la valeur maximale, on décale 1
par ce nombre de bits, moins 1. c'est-à-dire : (1 << bits.UintSize) - 1
Notez que lors du calcul de la valeur maximale de uint
vous devrez généralement l'insérer explicitement dans un fichier de type uint
(ou plus), sinon le compilateur risque d'échouer, car il tentera par défaut d'affecter ce calcul à une variable signée de type int
(où, comme cela devrait être évident, il ne conviendrait pas), donc :
const MaxUint uint = (1 << bits.UintSize) - 1
C'est la réponse directe à votre question, mais il y a aussi quelques calculs connexes qui peuvent vous intéresser.
Selon le spec , uint
y int
sont toujours de la même taille.
uint
soit 32 ou 64 bits
int
la même taille que uint
Nous pouvons donc également utiliser cette constante pour déterminer la valeur maximale de int
en prenant cette même réponse et en divisant par 2
puis en soustrayant 1
. ie : (1 << bits.UintSize) / 2 - 1
Et la valeur minimale de int
en déplaçant 1
par autant de bits et en divisant le résultat par -2
. ie : (1 << bits.UintSize) / -2
En résumé :
MaxUint : (1 << bits.UintSize) - 1
MaxInt : (1 << bits.UintSize) / 2 - 1
MinInt : (1 << bits.UintSize) / -2
exemple complet (devrait être le même que ci-dessous)
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)
}
5 votes
Jetez un coup d'œil à cet extrait
int(^uint(0) >> 1) // largest int
extrait de golang.org/doc/effective_go.html#impression