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
)
Contexte:
Comme je suppose que vous le savez, le uint
type est de la même taille que l'un uint32
ou l' autre uint64
, selon la plate-forme sur laquelle vous vous trouvez. Habituellement, on n'utiliserait la version non dimensionnée de ceux-ci que lorsqu'il n'y a pas de risque de se rapprocher 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'il a tendance à être "plus rapide" car l'utilisation d'un type non natif nécessite parfois des calculs supplémentaires et une vérification des limites à effectuer par le processeur, afin d'émuler le plus grand ou le plus petit entier. Dans cet 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 vérification des limites, donc s'il y a un risque qu'il entre en jeu, cela peut faire sens d'utiliser simplement la version de taille fixe et de laisser l'émulation optimisée gérer toutes les conséquences de cela.
Cela dit, il existe encore des situations dans lesquelles il est utile de savoir avec quoi vous travaillez.
Le package " math / bits " contient la taille de uint
, en bits. Pour déterminer la valeur maximale, décalez 1
de 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 la placer explicitement dans une uint
variable (ou plus grande), sinon le compilateur peut échouer, car il tentera par défaut d'assigner ce calcul dans un signe int
(où, comme il se doit être évident, cela ne rentrerait 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 pourraient vous intéresser.
Selon les spécifications , uint
et int
sont toujours de la même taille.
uint
soit 32 ou 64 bits
int
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 2
puis en soustrayant 1
. c'est à dire:(1 << bits.UintSize) / 2 - 1
Et la valeur minimale de int
, en décalant 1
de autant de bits et en divisant le résultat par -2
. c'est à dire:(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)
}
int(^uint(0) >> 1) // largest int
extrait de golang.org/doc/effective_go.html#printing